我正在尝试找到一种从大型数据集中进行随机选择的方法。
我们预计该集合将增长到大约 500K 条记录,因此找到一种在集合增长时保持良好性能的方法非常重要。
我尝试了一种技术:http://forums.mysql.com/read.php?24,163940,262235#msg-262235 http://forums.mysql.com/read.php?24,163940,262235#msg-262235但它并不完全是随机的,并且不能很好地与LIMIT
子句,您并不总能获得所需的记录数。
所以我想,由于 PK 是 auto_increment,我只需生成一个随机 id 列表并使用 IN 子句来选择我想要的行。这种方法的问题在于,有时我需要一组随机数据,其中的记录具有特定状态,该状态最多只占总数据集的 5%。为了做到这一点,我首先需要找出我的 IDcan使用具有特定状态的,所以这也不起作用。
我使用的是mysql 5.1.46,MyISAM存储引擎。
重要的是要知道选择随机行的查询将非常频繁地运行,并且它从中选择的表会频繁地附加到其中。
任何帮助将不胜感激!
您可以通过一些非规范化来解决这个问题:
- 构建一个包含与数据表相同的 pkey 和状态的辅助表
- 添加并填充状态组列,该列将是您自己自动编号的一种子键(相对于单个状态的基于 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 生成兰特。
有多种方法可以构建此表。您可以有一个间歇运行的程序,也可以实时执行。但后者会对性能造成影响,因为计算 StatusPkey 的成本可能会很高。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)