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

実際に600k の中からWHERE少なくとも間違った行を除外した場合、パフォーマンスはどうでしょうか? 99.99%言い換えれば、このクエリで最初に機能するのは何ですか?WHEREそれともORDER 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 カットは任意で不確定ですが、ランダムではないことです。おそらく、クエリに使用されるインデックスに基づいて実行されます。

于 2013-01-05T23:55:50.480 に答える
2

WHERE が最初に動作し、次に ORDER BY がソートする行数を減らしますが、WHERE によってより多くの時間が解放されました

また、クエリで EXPLAIN を実行すると、この速度または遅延の理由も示されます

于 2013-01-05T23:20:35.047 に答える