Mysql:快速从600k行中获取50行中的10个随机行(其余由WHERE排除)

时间:2013-01-05 23:07:47

标签: mysql performance select random sql-order-by

我的问题是基于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%个错误的行,那么性能怎么样? 换句话说,在此查询中首先起作用的是什么 - WHEREORDER BY RAND()

如果WHERE首先使用,这是否意味着ORDER BY RAND ()只排序60行(不是600k)并且运行得很快?

2 个答案:

答案 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在您的查询中,这也将指示此速度或延迟的原因