mysql使用rand随机查询记录的高效率方法

php中文网
发布: 2016-06-07 15:02:52
原创
1348人浏览过

一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了。 但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上 查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效

一直以为mysql随机查询几条数据,就用   
SELECT * FROM `table` ORDER BY RAND() LIMIT 5  
  
就可以了。   
但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上   
  
查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。   
  
    You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.   
  
  
搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。   
SELECT *   
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2   
WHERE t1.id >= t2.id   
ORDER BY t1.id ASC LIMIT 5;   
  
但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。   
  
上面的语句采用的是JOIN,mysql的论坛上有人使用   
SELECT *   
FROM `table`   
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )   
ORDER BY id LIMIT 1;   
  
我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。   
  
于是我把语句改写了一下。   
SELECT * FROM `table`   
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))    
ORDER BY id LIMIT 1;   
  
这下,效率又提高了,查询时间只有0.01秒   
  
最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。   
完整查询语句是:   
SELECT * FROM `table`   
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))    
ORDER BY id LIMIT 1;   
SELECT *   
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2   
WHERE t1.id >= t2.id   
ORDER BY t1.id LIMIT 1;   
  
最后在php中对这两个语句进行分别查询10次,   
前者花费时间 0.147433 秒   
后者花费时间 0.015130 秒   
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。

http://www.itlearner.com/ 向您的朋友推荐此文章 
文章关键词:  mysql  php  效率  

 ---★ 本文转摘自『IT学习者』→ http://www.itlearner.com/article/4643

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号