rand()查询效率问题解决

随机从数据表中取一条数据,我们一般会用到rand()函数,但是如果用不好的话,rand()的效率实在太低。

基础使用

SELECT * FROM tablename ORDER BY RAND() LIMIT 1

这是最基本的rand()用法。

实例测试

我再表里加了一千万条测试数据。

select * from card order by rand() limit 1;

这条语句竟然用了23秒多(我的机子性能还算可以的了),这实在令人崩溃。后来去看了mysql官方手册,里边意思是在order by 从句中使用rand()时,会导致数据列被多此扫描,所以效率会极低。

优化

后来在某社区发现了一个有趣的写法,先查出来表中最大的id,再查出来表中最小的id,然后两个id加起来,再用rand()函数乘以加以来的结果,用floor函数向下取整,取出id大于这个这个整数的数据,用时0.002秒,跟之前那种写法简直是天壤之别。

SELECT * FROM card
WHERE card_id >= (SELECT FLOOR( RAND() *((SELECT MAX(card_id) FROM card)-(SELECT MIN(card_id) FROM card)) + (SELECT MIN(card_id) FROM card))) ORDER BY card_id DESC;

注意

这里解释下为什么要用最大值,最小值相加的结果,而不用count函数,因为count算出来的结果不一定比最大的id大,这样的话随机出来的结果就会有瑕疵;

猜你喜欢

转载自blog.csdn.net/Attitude_do_it/article/details/121249109