10万行のテストテーブルを作成しました。このクエリの実行時間:
SELECT id FROM table
です0.032s。GROUP 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 に非常に慣れていないので、これはまったく正常なことかもしれませんが、返される行数を制限するとクエリの速度が大幅に低下することは直感に反するように思えます。
質問:
- これは正常ですか?
- LIMIT がクエリの速度を大幅に低下させないようにする方法はありますか?