Mysql rand()函数效率问题
PHPz
PHPz 2017-04-17 11:38:08
[MySQL讨论组]

查询语句

SELECT * FROM tablename ORDER BY RAND() LIMIT 100

查询效率极其低下,解释如下:

works for small tables, but once the tables grow larger than 300,000 
records or so this will be very slow because MySQL will have to process 
ALL the entries from the table, order them randomly and then return the
 first row of the ordered result, and this sorting takes long time. 
Instead you can do it like this (atleast if you have an auto_increment PK): 

可见得扫描全表再做随机排序,效率怎么能不低。

网上的解决办法

SELECT * FROM 'table'
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM 'table'))) 
ORDER BY id LIMIT 100;

通过 max(id) * rand()来确定随机数,不过个人认为这个办法有很大的局限
1)
RAND()*MAX(id)的值如果是最大id值,那怎么可能查的出来100条数据
2)
再者,如果id不是连续的,比如 1,2,3,1000,那这个查询也有问题

难道RAND()没有很好的解决方案么

PHPz
PHPz

学习是最好的投资!

全部回复(1)
PHP中文网

MySQL中ORDER BY RAND的确有性能问题,因为MySQL必需遍历所有的记录才能得到结果。
如果你只要100个,你可以考虑先select all id,从中随机挑选100个id,然后再select by id,这样会比较快,当然对于太大的dataset这样依然会有潜在的性能问题。
如果你的记录集实在太大,比如超过100M,那么你必须用一些变通的手段,比如定期随机给所有记录加上一个随机的RANK之类。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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