高效率的mysql rand()随机数方法

更新时间:2015-03-14 12:59:00 来源: 作者: 浏览2344次 文字大小:

在小数据量时很多东西是不需要考虑的,但大数据量时一点小小的区别也会导致很大的差异,比如 SELECT * FROM TABLE ORDER BY RAND() LIMIT 100,在操作一个30万记录的数据时耗时达到3.8877,非常有必要优化一下,网站上关于rand()的优化的方法也很多,今天在mysql官方网站上看到一条语句,确实能较大的提高效率,而且能保证随机.
通常我们查询随机这样做
SELECT * FROM TABLE ORDER BY RAND() LIMIT 100;  
SELECT * FROM TABLE ORDER BY RAND() LIMIT 100;但是在一个30万记录的表里面这个查询用了将近4秒,非常有必要优化一下,看到网上有这样的优化方式
速度虽然快了很多,非常可惜的是后面的数据并不随机了
Showing rows 0 - 29 (100 total, Query took 0.7098 sec)
view plaincopy to clipboardprint?
SELECT * FROM `ed_web_money` T JOIN ( SELECT FLOOR( MAX( ID ) * RAND( ) ) AS ID FROM `ed_web_money` ) AS x ON T.ID >= x.ID LIMIT 100  
SELECT * FROM `ed_web_money` T JOIN ( SELECT FLOOR( MAX( ID ) * RAND( ) ) AS ID FROM `ed_web_money` ) AS x ON T.ID >= x.ID LIMIT 100 继续另外的优化,这种方式大大的提高了效率
Showing rows 0 - 29 (100 total, Query took 0.0256 sec)

view plaincopy to clipboardprint?
SELECT * FROM `ed_web_money` AS a JOIN ( SELECT MAX( ID ) AS ID FROM `ed_web_money` ) AS b ON ( a.ID >= FLOOR( b.ID * RAND( ) ) ) LIMIT 100  
SELECT * FROM `ed_web_money` AS a JOIN ( SELECT MAX( ID ) AS ID FROM `ed_web_money` ) AS b ON ( a.ID >= FLOOR( b.ID * RAND( ) ) ) LIMIT 100  上面这种方式不仅保证了随机,而且时间仅为0.02秒,优化效率非常不错

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    文章评论

    评论

    帐  号: 密码: (新用户注册)
    验 证 码:
    表  情:
    内  容: