我正在寻找一种从MySQL表中随机选择100行满足特定条件的有效方法,这些行可能有数百万行。如何从MySQL表中随机选择满足特定条件的多行?
几乎所有我发现的建议避免使用ORDER BY RAND(),因为性能和可伸缩性较差。
但是,this article建议ORDER BY RAND()仍然可以用作获取randow数据的“快捷方式”。
基于这篇文章,下面是一些示例代码,显示了我试图完成的任务。我的问题是:
这是从一个表,可能有数百万行随机选择100(或多达几百个)行的有效途径?
什么时候成绩会成为问题?
SELECT user.* FROM ( SELECT id FROM user WHERE is_active = 1 AND deleted = 0 AND expiretime > '.time().' AND id NOT IN (10, 13, 15) AND id NOT IN (20, 30, 50) AND id NOT IN (103, 140, 250) ORDER BY RAND() LIMIT 100 ) AS random_users STRAIGHT JOIN user ON user.id = random_users.id
在索引字段上选择随机值是有意义的。 – Kayser 2012-03-28 16:52:34
@Kayser,我担心我们仍然需要扫描WHERE条件的所有行。这是否会影响性能与巨大的表(可能数百万行)? – user1298692 2012-03-28 17:05:04
使用pk-subselect的方法很可能只会稍微减少执行时间。这是因为无论使用或不使用这种技术,都会为所有匹配的行调用rand(),并且要排序的行数相同。假设“用户”有很多列或者大的列,并且mysql在LIMIT发生后没有足够的智能来实现用户*(这应该被测试),那么这很有趣。 – 2012-03-28 19:49:33