首页 > 解决方案 > 如何在 MySQL 中获取随机行(无自动增量)?

问题描述

我有一个大型数据库(MySQL、Aurora 无服务器),我想获取随机行(比如 1 或 5)我知道使用 SORT BY RAND() 非常慢,所以它被丢弃了。

我也知道这里有一些技巧使用行的标识符,但这仅在 id 是自动递增的整数时才有效。

在我的例子中,我的数据库使用 BINARY(16) 作为标识符/主键,它是一个随机生成的散列。

问题是,我应该怎么做才能检索此配置的随机行?

请注意,在我的情况下,速度比准确性更重要,所以如果它不是一个完全随机的行,这不是一个大问题。

我有一些不知道是好是坏的想法:

- 每次添加新行时,我还会添加一个使用 RAND() 的额外列,并使用该字段进行排序。问题是,这将一次又一次地生成相同的随机行。除非我定期更新该字段。似乎太复杂了。

- 发送 2 个请求。第一个获得最早的 createdAt 日期。然后,第二个,使用最旧的日期和现在之间的随机日期对其进行排序。这不是 100% 准确的,因为创建日期不是均匀分布的,但正如我所说,在我的用例中,速度比准确性更重要。

-不知何故,使用我的 id,因为它们已经是随机的,也许我可以从随机位开始排序。不知道。

你怎么看?你有更多的想法吗?谢谢。

标签: mysqlsqlrelational-databaseamazon-auroraaws-aurora-serverless

解决方案


如果您的 id 是真正随机的,您可以选择一个随机值并找到大于或等于该值的第一个 id。如果您的随机值恰好大于表中的任何 id,请再试一次。

理想情况下,您在代码中选择随机值,但这unhex(md5(rand()))是一种快速破解,应该会产生一个随机的 16 字节字符串:

select id
from yourtable
where id >= unhex(md5(rand()))
order by id
limit 1

推荐阅读