我正试图找到一种从大型数据集中随机选择的方法。
我们希望该集合增长到~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存储引擎 重要的是要知道选择随机行的查询将经常运行,并且它选择的表经常被追加。
非常感谢任何帮助!
答案 0 :(得分:2)
你可以用一些非规范化来解决这个问题:
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查询中解决。