如何在 MySQL 中获取随机行(无自动增量)?

里卡多

我有一个大型数据库(MySQL、Aurora 无服务器),我想获得随机行(如 1 或 5)我知道使用 SORT BY RAND() 非常慢,因此将其丢弃。

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

就我而言,我的数据库使用 BINARY(16) 作为标识符/主键,它是一个随机生成的哈希。

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

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

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

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

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

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

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

口渴

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章