看此篇文章的朋友应该或多或少了解,在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必须是主键,且值都为连续,取出的结果主键也是连续的,所以建议主键是连续的这样做,若主键之间的值相差较多,则可能出现其它问题。