1.需求
从文章表的10万条数据中查询出某个类别的 15 条随机的记录,效率高一点2.原代码SELECT * FROM tb_article where CategoryID=4 ORDER BY RAND() LIMIT 15;
3.经历
此代码查询需要5秒左右,效率跟不上,影响应用4.百度后结果
/*高效随机查询*/
SELECT * FROM `tb_article` AS t1 
JOIN (
SELECT ROUND(
RAND() * 
((SELECT MAX(AutoID) FROM `tb_article`)-(SELECT MIN(AutoID) FROM `tb_article`))+
(SELECT MIN(AutoID) FROM `tb_article`)
) AS AutoID
) AS t2
WHERE t1.AutoID >= t2.AutoID ORDER BY t1.AutoID LIMIT 15;分析:效率虽高,可是查出来的数据都是某个位置上的15条数据,如(8562,8563,8564,8565......),并不是每条都随机,不太符合需求5.今奈何,盼高人多指点,小生临帖涕零,不知所言,望多助也!!

解决方案 »

  1.   

    SELECT * FROM tb_article where CategoryID=4  LIMIT 15;
      

  2.   

    没有好办法仅通过SQL实现“10万条数据中查询出某个类别的 15 条随机”。下面是一种常见的方法:
    1. 创建  (CategoryID,AutoID)的复合索引
    2. 通过程序或存储过程生成随机数
    3 select * from tb_article  where  CategoryID=4 order by AutoID limit 成随机数,1
      

  3.   

    想到个方法,不知道是否可行。
    1:用SELECT FLOOR(1 + (RAND() * 60000));得到一个随机数
    2:反复调用15次,得到15个随机ID,在这里可以判断如果有重复的,重新取随机数。
    3:select * from table1 where id=1 union all select * from table1 where id=2 .....这样拼出15条记录,得到的记录集就是15条随机记录了。而且单个记录都是利用到主见索引的,效率很快。要在ID上建一个自增主键。
      

  4.   

    这个是老问题了一般来说LS的方法可行 总之 直接使用order by rand()是很不可取的》。。应该先产生随机值 然后比较 
      

  5.   

    参考覆盖索引
    http://topic.csdn.net/u/20100809/21/f93b095c-3ccd-4eeb-846e-bfdfece79ac6.html
      

  6.   

    order by rand() 在大表上效率很低下建议另找一种算法,来生成 id 的一个序列,比如随便生成10个符合条件的ID,然后进行查询