上面这个随机数的获得可以通过后台程序来完成。此方法的前提是表的ID是连续的或者自增长的。
这个方法已经成功避免了ORDER BY的产生。
有没有可能不用ORDER BY,用一个SQL语句实现方法二?可以,那就是用JOIN。
SELECT * FROM Bar B JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Bar) AS m ON B.ID >= m.ID LIMIT 1;
此方法实现了我们的目的,同时,在数据量大的情况下,也避免了ORDER BY所造成的所有记录的排序过程,因为通过JOIN里面的SELECT语句实际上只执行了一次,而不是N次(N等于方法二中的num_rows)。而且, 我们可以在筛选语句上加上“大于”符号,还可以避免因为ID好不连续所产生的记录为空的现象。
在MySQL中查询5条不重复的数据,使用以下:
SELECT * FROM table ORDER BY RAND() LIMIT 5
就可以了。但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上
搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。
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 5;
但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。
上面的语句采用的是JOIN,mysql的论坛上有人使用
SELECT *
FROM table
MySQL高效随机查询记录技巧

本文探讨了在MySQL中以高效率随机查询记录的方法,包括避免使用ORDER BY,利用JOIN和RAND()函数优化查询,以及如何处理不连续ID的情况。通过实例展示了不同查询语句的性能对比,并给出了完整的高效查询语句。
最低0.47元/天 解锁文章
1835

被折叠的 条评论
为什么被折叠?



