2012-06-13 40 views
0

我有一个SELECT查询,我期待数以百万计的结果。我需要在MySQL中随机化这些结果。在查询后,在我的脚本中执行它显然使用了太多的RAM。有人可以重做这个查询,以便结果都是随机的,而不使用rand()命令吗?我看过一些例子并试图使用它们,但它们不适用于我,因为它们似乎都依赖于返回整个表而不是使用WHERE子句。这里是我的查询:MySQL如何安全地随机化这个查询的输出?

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

究竟你尝试过产生在此范围内的随机数?你说过“尝试一些例子”,那么它们是什么?使用ORDER BY RAND()有什么问题? – Arran

+0

的例子只是真的不适用于我的查询,所以我没有发布它们。 ORDER BY RAND()不适用于大型表格。分区结束,查询需要几年才能完成一个1000万行的表。 – xendi

+0

'ORDER BY RAND()'巨大的表格非常缓慢。它生成额外的临时表,更多的解释在这里: Zefiryn

回答

0

如果你有10万用的ID,都在一个连续的范围内?

  1. 通过快速选择从您想要的范围中获取最低的ID。
  2. 获取最大的ID。
  3. 使用PHP
  4. 一旦你有你的号码“SELECT * FROM WHERE(您生成的数字)ID table1中”或类似的东西
0

如果您可以使用其他语言,比如PHP,你可以使用它rand()功能是生成ID,并添加到查询就像

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

或以任何类似的东西你正在使用的语言。

如果你需要这样做纯MySQL查询,然后这里有一些alternaties:http://www.electrictoolbox.com/msyql-alternative-order-by-rand/

+0

带来1000万ids到php和洗牌他们不会工作。其太多的数据不能保存在RAM中。我看到那篇文章,但它假设你想要整个表格。如果我添加一个WHERE子句它不会工作。 – xendi

+0

然后编写一个函数,该函数将从给定范围内生成ID数量的ID。我假设你需要一次从那张大桌子的50行。 – Zefiryn