设为首页收藏本站
开启辅助访问

创星网络[分享知识 传递快乐]

 找回密码
 立即注册

QQ登录

只需一步,快速开始

用新浪微博登录

只需一步,快速搞定

搜索

关于Mysql ORDER BY RAND()效率低问题及解决方案

2012-8-8 11:17| 发布者: cryinglily| 查看: 455| 评论: 0|原作者: luinstein

摘要: 我个人认为,暂时并没有十全十美的解决办法,关于这个order byrand()重复多次扫描表的问题,如果你的数据超过10万,效率低的能吓死你。网上有解决办法: SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ...
                        我个人认为,暂时并没有十全十美的解决办法,关于这个order byrand()重复多次扫描表的问题,如果你的数据超过10万,效率低的能吓死你。网上有解决办法:
  1. SELECT *

  2. FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id)
  3. FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM
  4. `table`)) AS id) AS t2

  5. WHERE t1.id >= t2.id

  6. ORDER BY t1.id LIMIT 1;
复制代码

这种解决办法的致命问题是,每次只能查询一条,你要是随机抽取100条数据,就得循环一百次来查询,岂不是要命?如果直接把LIMIT后面的数值改成超过1,那么得到的将会是连续的行数,那是不可以的。


小弟也曾闻,有牛叉的工程师就是这么解决的。


小弟的解决办法是:用程序语言,比如php随机产生你需要的随机数:略大于需要的数量,然后从中抽出需要的数据,这样基本算是一个比较好的解决办法。


  1. $maxid= $db->fetch_first_field("SELECT MAX(id) FROM
  2. table LIMIT 1");

  3. $minid = $db->fetch_first_field("SELECT MIN(id) FROM
  4. table LIMIT 1");

  5. // 随机产生15个id

  6. $randids = array();

  7. for($i=0;$i<15;$i++){

  8. $randids[] = rand($minid, $maxid);

  9. }

  10. $randid = implode(',', $randids) ;

  11. $rand_data =
  12. $db->fetch_all("SELECT * FROM table WHERE 1 AND id
  13. IN($randid)  LIMIT 10");
复制代码

这种办法查询出来的数据有可能是你一下子查到来一个死角,比如你产生的随机id里,刚好只有不到10条的有效记录,那怎么办?重复查询呗!
while(count($rand_data)<10){
// 重复查询
}

from:http://blog.sina.com.cn/s/blog_6f1f9ead0100rtfu.html
                                                                       


鲜花

握手

雷人

路过

鸡蛋

相关分类

QQ|Archiver|手机版|小黑屋|创星网络 ( 苏ICP备11027519号|网站地图  

GMT+8, 2024-5-17 14:21 , Processed in 0.056724 second(s), 16 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

返回顶部