探究orderbyrand()

发布时间:2023-05-21

一、作用与用法

orderbyrand() 函数可以随机排序 MySQL 查询结果的行。对于那些需要随机取数据库里的一些记录,然后按照自己的需求排序的情况下,可以使用 orderbyrand() 函数。 该函数的用法如下:

SELECT * FROM table
ORDER BY RAND();

可以看出,该函数可以在 SELECT 语句的 ORDER BY 子句中使用。需要注意的是,如果该函数在一个大表中需要排序的情况下,会有比较差的性能表现。

二、效率问题

对于 orderbyrand() 函数,随机排序会让 MySQL 数据库服务极度受损,查询返回的结果可能会很慢。其主要原因是,当查询结果集较大时,在随取随设的情况下,优化器无法对该场景进行优化,从而无法使用索引,执行效率会变低。 当表的数据行较少,如小于 1000 条的时候,orderbyrand() 函数效果还是比较好的,毕竟 MySQL 会按照表的大小选择不同建立临时表的方式,同时加上优化器的选择算法,尽可能地使询最优。 当我们的需求需要查询整个大表的数据并且需要随机取出一部分,然后再根据其他条件进行排序,我们可以采取以下的方式:

SELECT *
FROM ( SELECT * FROM big_table WHERE some_condition LIMIT 10000 ) 
ORDER BY RAND() LIMIT 100;

这里我们首先对大表进行一些条件限制和筛选,然后在这个限制过的结果集上进行 randomly 的排序,然后再限制取前面一部分,这样效率会更高。

三、其他用法举例

orderbyrand() 函数并不只是被用于简单的排序,他还可以被用于数据的随机分组等有效地需求情况。下面我们来举一个简单的例子:

SELECT name, address, email FROM members
WHERE gender='M'
ORDER BY RAND()
LIMIT 5;

这里我们从 members 表里选出所有性别为男的数据,然后再进行随机排序,最后选取前 5 个记录,这样我们可以来随机筛选出 5 个男性成员信息。

四、小结

上文介绍了 SQL 中 orderbyrand() 函数的作用、用法、效率问题和一些其他用法的举例。虽然该函数有着明显的缺点,但我们还是可以在一些特殊的情况下使用它来达到自己的需求。在实际的开发过程中,需要我们结合自身的实际情况灵活使用。