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