如何从包含至少100万个寄存器的表中随机获取10行?我通过随机()阅读有关订单,但许多人说这是如此缓慢。在这种情况下我可以使用哪种算法?
答案 0 :(得分:3)
ORDER BY RAND() LIMIT n
非常耗时。但它确实给出了n
个不同行的伪随机选择。
您可以尝试这样做。它仍然需要扫描你的桌子,但它不必排序。这并不能保证十行;它可能会产生更多或更少。
SELECT *
FROM (
SELECT a.*
FROM mytable a
JOIN (select COUNT(*) rowcnt, 10 samplecnt from mytable) c
WHERE RAND() <= (CAST(samplecnt AS DOUBLE) )/ CAST(rowcnt AS DOUBLE)
) sample
ORDER BY rand()
它的工作原理是使用伪随机数来选择是否在结果集中包含表的每一行。
在我有750K行的测试表上,ORDER BY RAND() LIMIT 10
方法比WHERE RAND() <=...
方法慢三倍。