对 SQL ORDER BY RAND() 的理解

如果你想知道 ORDER BY RAND() 有什么作用,请参考ORDER BY RAND() 是什么?这个章节。

如果你想知道 ORDER BY RAND() 的原理,请参考ORDER BY RAND() 的原理这个章节。

如果你想知道使用 ORDER BY RAND() 的注意事项,请参考使用 ORDER BY RAND() 的注意事项

如果你想知道其他数据库如何获取随机的数据,请参考其他数据库如何实现 ORDER BY RAND()

ORDER BY RAND() 是什么?

ORDER BY RAND() 可以在 MySQL 数据库(以及一些基于 MySQL 的数据库)中实现数据的随机排序。

需要注意的是,ORDER BY RAND() 虽然在 SQL Server 数据库中同样没有语法问题,但是并不能实现随机排序(而是没有效果)。

ORDER BY RAND() 的原理

这里我们只解释 MySQL 数据库中 ORDER BY RAND() 的原理。

我们基于一个例子来解释,下边的 SQL 使用了 ORDER BY RAND(),其作用是从 test_table 中获取一条随机的数据。

1
2
3
4
SELECT *
FROM test_table
ORDER BY RAND()
LIMIT 1;

RAND() 函数会给每行数据都生成一个随机数。ORDER BY 会根据这个生成的随机数进行排序,由于 RAND() 每次执行生成的数字都是随机的,所以这个查询每次获取到的结果也都是随机的。

使用 ORDER BY RAND() 的注意事项

潜在性能问题

ORDER BY RAND() 可能存在潜在的性能问题。

由于 ORDER BY RAND() 会查询出来的所有数据的每一行都计算一次 RAND(),所以如果查询的表数据量非常大,那么性能消耗会非常大。所以在表数据比较小的时候用一用没什么大问题,但是表中数据量比较大的时候,可能就得考虑优化了。

如果想知道详细的性能优化方案以及效果,可以参考这篇文章:ORDER BY RAND() - ~jk

其他数据库如何实现 ORDER BY RAND()

如果想知道其他数据库如何实现随机排序,这里有一些参考资料:

SELECT a random row with SQL(各种 DBMS 如何查询一条随机的数据,包括 MySQL、PostgreSQL、SQL Server、DB2、Oracle 的方法)

参考资料

  1. MySQL :: MySQL 8.4 Reference Manual :: 14.6.2 Mathematical Functions【MySQL 官方对于 RAND() 函数的定义以及解释】
  2. ORDER BY RAND() - ~jk
  3. php - MySQL ORDER BY rand(), name ASC - Stack Overflow