首页 > 技术分享 > MySQL
收藏

Mysql取随机值order by rand()的替代方案

06/05 18:56
大潇博客 原创文章,转载请标明出处

看此篇文章的朋友应该或多或少了解,在Mysql中order by rand() limit 1的效率


再啰嗦一下:order by rand()执行时会多次全局扫描数据表,若只有几千条数据,或许也可接受,但几万乃至更多数据时,效率会非常慢,如果再加上limit,没多加一条结果,执行操作就会多一倍,所以官方文档也不推荐使用这个来取随机结果。


这里推荐使用下面语句:

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 1;


用这条SQL语句取结果时,条件中的id必须是主键,且值都为连续,取出的结果主键也是连续的,所以建议主键是连续的这样做,若主键之间的值相差较多,则可能出现其它问题。


打赏

阅读排行

大家都在搜

博客维护不易,感谢你的肯定
扫码打赏,建议金额1-10元
  • 15601023311