2

想象一个具有非常高行数(例如 3 亿行)的 sql 表。

每行都有一个文本字段,我想随机检索 10 行。

问题是使用

select key from the_table where enabled=1 order by rand() limit 10

计算 rand 值并按该值对所有行进行排序是非常高的负载。

有没有办法避免这种情况?

4

2 回答 2

1

我会测试(时间)可能的解决方案,以验证它们确实像您怀疑的那样慢。

如果您的主键是顺序的或可预测的,也许您可​​以从代码中或作为过程的一部分生成 10 个随机键,然后SELECT按键生成 10 条记录。

例如,如果您的键是连续的数字 ID,那么您将在and和使用RAND之间生成 10 个数字Min(ID)Max(ID)WHERE Id in (rand1, rand2, rand3 ...)

于 2012-06-01T15:50:54.417 回答
1

如果您可以在 SQL 之外生成密钥(即使需要使用 15-20 来获得启用的 10 个),那么您可以跳过 order() 这几乎可以肯定是要加载的问题

SELECT 键 WHERE 键 [x,y,z....]

其中 x,y,z 是在外部随机生成的。

更好的是,您可以创建一个已启用键的表,随机排序并以 10 个为一组进行翻页。您需要偶尔更新它,并且会在空间上有所损失,但这可能没什么大不了的。

有更复杂的解决方案,但这会让你感动。

于 2012-06-01T15:49:23.620 回答