【问题标题】:MySQL how to safely randomize the output of this query?MySQL如何安全地随机化这个查询的输出?
【发布时间】:2012-06-13 22:03:15
【问题描述】:

我有一个 SELECT 查询,我期望从中获得数百万个结果。我需要在 MySQL 中随机化这些结果。查询后在我的脚本中执行此操作显然会使用太多 RAM。有人可以重做这个查询,以便结果都是随机的,而不使用 rand() 的顺序吗?我看过一些示例并尝试使用它们,但它们对我不起作用,因为它们似乎都依赖于返回整个表而不是使用 WHERE 子句。这是我的查询:

SELECT * FROM pool
WHERE gender = 'f'
AND (`location` = 'united states' OR `location` = 'us' OR `location` = 'usa');

【问题讨论】:

  • 你到底尝试了什么?您已经说过“尝试了一些示例”,那么它们是什么?使用 ORDER BY RAND() 有什么问题?
  • 这些例子真的不适用于我的查询,所以我没有发布它们。 ORDER BY RAND() 不适用于大表。分区最终被填满,查询需要数年才能在 1000 万行表上完成。
  • ORDER BY RAND() 使用巨大的表非常慢。它会生成额外的临时表,这里有更多解释:stackoverflow.com/questions/6592751/…>
  • 我知道不要将它用于此查询。我只是不知道我应该使用什么,因为我有这个 WHERE 子句
  • 您要返回多少行?全部?

标签: mysql performance random


【解决方案1】:

如果您有 1000 万行带有 id 的行,它们是否在一个连续的范围内?

  1. 通过快速选择获取所需范围内的最低 id。
  2. 同时获取最大的 id。
  3. 使用php生成这个范围内的随机数
  4. 一旦你有你的号码“SELECT * FROM table1 WHERE id IN(你生成的号码)”或类似的东西

【讨论】:

    【解决方案2】:

    如果您可以使用其他语言,例如 php,您可以使用其rand() 函数来生成 id 并将其添加到查询中

    $ids = range($mini, $maxid);
    shuffle($ids);
    array_slice($ids, 0, $quantity);
    

    或您使用的任何语言的类似内容。

    如果您需要在纯 mysql 查询中执行此操作,那么这里有一些替代方法:http://www.electrictoolbox.com/msyql-alternative-order-by-rand/

    【讨论】:

    • 将 1000 万个 id 带入 php 并对其进行洗牌是行不通的。它的数据太多,无法保存在 RAM 中。我看到了那篇文章,但它假设你想要整张桌子。如果我添加 WHERE 子句,它将不起作用。
    • 然后编写一个函数,该函数将在给定范围内生成$quantity 个id。我假设您一次需要从那个大表中提取 50 行。
    猜你喜欢
    • 1970-01-01
    • 2011-03-06
    • 2014-08-15
    • 2010-11-15
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多