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.今奈何,盼高人多指点,小生临帖涕零,不知所言,望多助也!!
从文章表的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. 创建 (CategoryID,AutoID)的复合索引
2. 通过程序或存储过程生成随机数
3 select * from tb_article where CategoryID=4 order by AutoID limit 成随机数,1
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上建一个自增主键。
http://topic.csdn.net/u/20100809/21/f93b095c-3ccd-4eeb-846e-bfdfece79ac6.html