MySQL 如何查询随机数据

来到这个页面,你很可能有这种需求:

如何从一张 MySQL 数据库的表中随机获取一些数据?

这里我们把这个问题分为两类:

我们会针对两种场景分别讨论,并给出若干种方案。

随机获取一行数据

方法1:基于 ORDER BY RAND()

示例:

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

缺点:

  • 当表中数据量很大的时候,使用 ORDER BY RAND() 性能可能会比较差,有可能需要几秒甚至几分钟才能出结果。

方法2:基于 RAND() 和 MAX() 取随机的连续若干行数据

适用场景:

  • 主键或者唯一索引是数字类型
  • 主键或者唯一索引是连续的、均匀分布的

方法3

如果你用的表的主键或者唯一索引并不是数字类型的,比如是 UUID,那么应该怎么办呢?

方法3:SQL 和程序代码结合

首先,使用 MAX(emp_no) 查询出来最大的 ID。

1
2
SELECT MAX(emp_no)
FROM employees;

方法4:两步法,先查询最大值,然后基于 OFFSET

随机获取多行数据

21312312321

参考资料

  1. php - MySQL ORDER BY rand(), name ASC - Stack Overflow
  2. ORDER BY RAND() - ~jk
  3. SELECT a random row with SQL【这篇文章主要是关于取单行数据,而且是把网上不同数据库的方案放到一篇文章中了,针对性能问题,提到了一个使用 OFFSET 解决 MySQL 和 PostgreSQL 的手段,还提到别的数据库中有类似机制,但是没有详细介绍】