在大表中为每个组选择一个随机行

时间:2012-05-30 00:30:47

标签: mysql database random group-by large-data

我有一个非常大的表(超过10M甚至100M记录),这个模式:

id int primary key,rule int

并希望为每个规则选择一个随机条目。我尝试了这个查询,但这需要很长时间(treenode是表的名称):

SELECT tmp.id,tmp.rule FROM treenode
LEFT JOIN (SELECT * FROM treenode ORDER BY RAND()) tmp ON (treenode.rule = tmp.rule)
GROUP BY tmp.rule;

将数据作为哈希表保存在内存中会占用大量内存。 另一种选择是从数据库中获取每个组并选择一个随机条目。同样,当组的数量大约为100k时,将这些数量的查询发送到数据库需要很长时间。

更新: 我可以补充说,这个表只填充一次,并且不会有任何变化。 id和规则中有洞。

2 个答案:

答案 0 :(得分:2)

也许我遗漏了一些东西,但不低于查询等同于您的查询?

SELECT * FROM  ( SELECT * FROM treenode ORDER BY RAND()) x GROUP BY x.rule;

由于没有联接可以做得更快。

答案 1 :(得分:0)

我发现通过所有条目所花费的时间比此查询少。所以我添加了一个列作为规则* max(id)+ id并在其上创建了一个索引(我应该使用视图吗?)。

我运行以下查询:

SELECT id,rule,temp FROM treenode where temp>? ORDER BY temp LIMIT 0,100000;

在客户端查看所有返回的条目并填写缓冲区。每当规则改变时,我从缓冲区中选择一个随机项并清除它(put index = 0)。然后我再次运行查询?作为最后返回的临时值的值。