3

我有一个非常大的表(超过 10M 甚至 100M 记录),其中包含以下模式:

id int 主键,规则 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 和 rule 有漏洞。

4

2 回答 2

2

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

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

它会更快,因为没有连接要做。

于 2012-05-30T01:55:40.157 回答
0

我发现浏览所有条目所需的时间比这个查询要少。所以我添加了一列作为 rule*max(id)+id 并在其上创建了一个索引(我应该使用视图吗?)。

我运行以下查询:

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

在客户端浏览所有返回的条目并填充缓冲区。每当规则更改时,我都会从缓冲区中选择一个随机项目并将其清除(设置索引 = 0)。然后我再次运行查询?作为最后返回的临时值的值。

于 2012-05-30T16:33:19.530 回答