我有一个非常大的表(超过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和规则中有洞。
答案 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)。然后我再次运行查询?作为最后返回的临时值的值。