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.今奈何,盼高人多指点,小生临帖涕零,不知所言,望多助也!!
解决方案 »
- MySQL服务器一般能处理多大数据量的处理(标准配置的硬件设备)。
- mysql 怎么查询特定字符串在整个库中的哪个表哪个字段?
- mysql中怎么做能每个表建一个数据文件,然后索引和数据文件分开?
- 如何让 MySQL5 在光盘中运行
- Mysql问题:Connection refused: connect
- SQL统计某张表的数据问题,表内数据平均一天1千多万[高分,分不够可以加,只要能把问题解决]
- 删除表中的一条记录
- mysql的if语句是否能内嵌sql语句呢?主要为了解决一条记录不存在就插入否则就更新的问题
- 为什么我装的mysql版本sql语句不支持子句?
- 提示没权限怎么办?
- 求高手写一个SQL
- mysql phpmyadmin如何改变数据库的字符集??
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