如何从MySQL数据库表中获取没有数字ID的随机行?

5
我有一个分片的MySQL数据库表,分布在多台服务器上,并希望有一个函数来获取随机记录。
在我看来,最好的方法是:
1. 在(Perl)应用程序层中选择一个随机分片。 2. 从该分片的表中选择一行随机记录。
本问题将重点关注解决方案的第2部分。
我的表没有数字ID,我们决定使用GUID以避免维护票务服务的开销。我们将GUID与分片标识符结合使用,以确保它们是唯一的。
表格大致如下:
guid                                        name      details
003-b0470602-a64b-11da-8632-93ebf1c0e05a    Aura      Some details

到目前为止,我想到的最好的答案是由 Jack 提出的,具体做法如下:
  1. 计算数据库中记录的数量。
  2. 获取一个介于 1 和步骤 1 结果之间的随机数。
  3. SELECT * FROM table LIMIT {步骤 2 的结果}
  4. 从这个(可能非常大的)结果集中取出最后一个结果。
我担心这种处理方式可能会非常耗费资源(虽然肯定比 ORDER BY RAND() LIMIT 1 好),并且想知道是否有任何更好的解决方案可以与非数字标识符一起使用。

1
+1。问题现在酷炫了20%。 - SPArcheon
1个回答

6
"

LIMIT 1 OFFSET N(其中N为0到记录数-1的数字)会更好,减少从DB服务器传输的记录数量,无需为排序生成随机数据。

此外,某些RMDBs可能会非常高效地执行该偏移量 - 但我不知道MySQL在您的表定义上是否会这样做,您应该测试性能。

"

哇,我实际上不知道OFFSET关键字的存在。谢谢。 - Glitch Desire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接