随机化大数据集

时间:2010-08-24 16:27:47

标签: mysql random

我正试图找到一种从大型数据集中随机选择的方法。

我们希望该集合增长到~500K记录,因此找到一种在集合增长时保持良好表现的方法非常重要。

我尝试了一种技术:http://forums.mysql.com/read.php?24,163940,262235#msg-262235但它不是完全随机的,并且它不能很好地与LIMIT子句一起使用,你并不总是得到你想要的记录数。 / p>

所以我想,既然PK是auto_increment,我只生成一个随机id列表并使用IN子句来选择我想要的行。这种方法的问题在于,有时我需要一组随机数据,其记录具有特定状态,该状态最多可在总集合的5%中找到。为了完成这项工作,我首先需要找出具有该特定状态的我可以使用的ID,这样做也不会有效。

我正在使用mysql 5.1.46,MyISAM存储引擎 重要的是要知道选择随机行的查询将经常运行,并且它选择的表经常被追加。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

你可以用一些非规范化来解决这个问题:

  • 构建一个包含与数据表相同的pkeys和状态的辅助表
  • 添加并填充状态组列,该列将是您自己编号的一种子密钥(相对于单个状态的基于1的自动增量)
Pkey    Status    StatusPkey
1       A         1
2       A         2
3       B         1
4       B         2
5       C         1
...     C         ...
n       C         m (where m = # of C statuses)

当您不需要过滤时,您可以在pkey上生成rand #s,如上所述。当您需要过滤时,然后针对您感兴趣的特定状态的StatusPkeys生成rands。

有几种方法可以构建此表。你可以有一个间隔运行的程序,或者你可以实时执行。后者会受到性能影响,因为计算StatusPkey可能会变得昂贵。

答案 1 :(得分:1)

查看Jan Kneschke的this article ...它在解释这个问题的不同方法的利弊方面做得很好......

答案 2 :(得分:0)

您可以有效地执行此操作,但必须在两个查询中执行此操作。

首先获得一个随机偏移量,该偏移量按照符合5%条件的行数进行缩放:

SELECT ROUND(RAND() * (SELECT COUNT(*) FROM MyTable WHERE ...conditions...))

返回一个整数。接下来,使用整数作为LIMIT表达式中的偏移量:

SELECT * FROM MyTable WHERE ...conditions... LIMIT 1 OFFSET ?

并非每个问题都必须在单个SQL查询中解决。