1

10万行のテストテーブルを作成しました。このクエリの実行時間:

SELECT id FROM table

です0.032sGROUP BYとしてインデックス付けされた整数列のステートメントを追加するNormal,BTREEと、クエリの実行時間は次のようになります。

SELECT id FROM table GROUP BY indexedColumn

EXPLAIN 出力:

id | select_type | table | type |    possible keys   | key  | key_len | ref |  rows  | Extra
 1      SIMPLE    [table]  All    [indexedColumnKey]   null    null    null   105416   Using temporary; Using filesort

です0.073s。のせいで実行時間が2倍になりましたがGROUP BY、それは正常だと思いますか?私が持っている質問は、なぜLIMIT次のようにクエリに追加するのかということです:

SELECT id FROM table GROUP BY indexedColumn LIMIT 500

EXPLAIN 出力:

id | select_type | table | type |      possible keys    |        key        | key_len | ref |  rows  | Extra
 1      SIMPLE    [table]  index    [indexedColumnKey]   [indexedColumnKey]      5      null   500     null

実行時間を0.301s? これは 4 倍以上の速度低下です。

私は SQL に非常に慣れていないので、これはまったく正常なことかもしれませんが、返される行数を制限するとクエリの速度が大幅に低下することは直感に反するように思えます。

質問:

  1. これは正常ですか?
  2. LIMIT がクエリの速度を大幅に低下させないようにする方法はありますか?
4

1 に答える 1