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

时间:2014-03-25 11:09:51

标签: mysql database perl random

我有一个分散在多个服务器上的分片MySQL数据库表,并希望有一个函数来获取随机记录。

我看到它的方式,最好的方法是:

  1. 在(Perl)应用程序层中选择随机分片。
  2. 从该分片上的表中选择一个随机行。
  3. 这个问题将集中在解决方案的第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 {result from step 2}
    4. 从此(可能非常大)的结果集中获取最后一个结果。
    5. 我担心这涉及的处理可能会非常大(虽然肯定比ORDER BY RAND() LIMIT 1更好,并且想知道是否有人有更好的解决方案可以使用非数字标识符。

1 个答案:

答案 0 :(得分:6)

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

此外,一些RMDB可能非常有效地执行该偏移 - 但我不知道MySQL是否会在您的表定义上,您应该测试性能。