我的问题是基于 SO MySQL select 10 random rows from 600K rows fast . 据了解
SELECT column FROM table
ORDER BY RAND()
LIMIT 10
对于大表来说太慢了,使用了另一种技巧和方法来提取一些行。
但是如果我使用 WHERE:
SELECT column FROM table
WHERE colA=123
ORDER BY RAND()
LIMIT 10
如果 WHERE
实际上排除了至少 99.99%
600k 中的错误行,那么性能如何?
换句话说,在这个查询中什么首先起作用 - WHERE
或 ORDER BY RAND()
?
如果 WHERE
先工作,这是否意味着 ORDER BY RAND ()
仅排序 60 行(不是 600k)并且工作速度很快?
最佳答案
如果这表现良好(对您来说足够快)并且返回的行数不多(例如,少于 1000 行):
SELECT column FROM table
WHERE colA=123 ;
那么这也会执行得很好,因为它只会对前一个查询的(少于 1000)行进行排序:
SELECT column FROM table
WHERE colA=123
ORDER BY RAND()
LIMIT 10 ;
如果你想确定它会执行得很好,即使第一个查询返回数千或数百万行,你可以使用它,它将排序限制为最大 1000(或你选择的数字)行:
SELECT column
FROM
( SELECT column FROM table
WHERE colA=123
LIMIT 1000
) AS tmp
ORDER BY RAND()
LIMIT 10 ;
缺点是如果确实有很多行,1000-cut会是任意的,不确定的,但不是随机的。它可能会根据用于查询的索引来完成。
关于Mysql:从600k行中快速获取50行中的10行(其余由WHERE排除),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14177407/