mysql 随机选取一条记录 – rand() 坑

要从tablename表中随机提取一条记录,大家一般的写法就是:

1
SELECT * FROM tablename ORDER BY RAND() LIMIT 1。

RAND() 函数返回的是一个小于1的随机数

但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。

但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上
修改写法后

1
2
3
SELECT * FROM `table`
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
ORDER BY id LIMIT 1;

这下,效率提高了,查询时间只有0.01秒
完成收工
个人微信 :yx159337
欢迎一起探讨