1

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

如果WHERE首先工作,这是否意味着ORDER BY RAND ()只排序 60 行(而不是 600k)并且工作速度很快?

4

2 回答 2

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-cut 将是任意和不确定的,但不是随机的。它可能会根据用于查询的索引来完成。

于 2013-01-05T23:55:50.480 回答
2

WHERE 首先工作,是的,然后 ORDER BY 获得更少的行数来排序,但更多的时间被 WHERE 释放

还运行 EXPLAIN 在您的查询上,这也将表明为什么这种速度或延迟

于 2013-01-05T23:20:35.047 回答