我的问题是基于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
实际上排除了600k中至少99.99%
个错误的行,那么性能怎么样?
换句话说,在此查询中首先起作用的是什么 - WHERE
或ORDER BY RAND()
?
如果WHERE
首先使用,这是否意味着ORDER BY RAND ()
只排序60行(不是600k)并且运行得很快?
答案 0 :(得分:3)
如果这表现良好(足够快)并且返回的行数不多(比如小于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次切割将是任意的且不确定但不是随机的。它可能会基于用于查询的索引来完成。
答案 1 :(得分:2)
WHERE首先工作,是的,然后ORDER BY获得更少的行数进行排序,但WHERE释放了更多的时间
同时运行EXPLAIN在您的查询中,这也将指示此速度或延迟的原因