想象一个具有非常高行数(例如 3 亿行)的 sql 表。
每行都有一个文本字段,我想随机检索 10 行。
问题是使用
select key from the_table where enabled=1 order by rand() limit 10
计算 rand 值并按该值对所有行进行排序是非常高的负载。
有没有办法避免这种情况?
我会测试(时间)可能的解决方案,以验证它们确实像您怀疑的那样慢。
如果您的主键是顺序的或可预测的,也许您可以从代码中或作为过程的一部分生成 10 个随机键,然后SELECT
按键生成 10 条记录。
例如,如果您的键是连续的数字 ID,那么您将在and和使用RAND
之间生成 10 个数字Min(ID)
Max(ID)
WHERE Id in (rand1, rand2, rand3 ...)
如果您可以在 SQL 之外生成密钥(即使需要使用 15-20 来获得启用的 10 个),那么您可以跳过 order() 这几乎可以肯定是要加载的问题
SELECT 键 WHERE 键 [x,y,z....]
其中 x,y,z 是在外部随机生成的。
更好的是,您可以创建一个已启用键的表,随机排序并以 10 个为一组进行翻页。您需要偶尔更新它,并且会在空间上有所损失,但这可能没什么大不了的。
有更复杂的解决方案,但这会让你感动。