MySQL クエリのパフォーマンスを調整しようとしていますが、理解できない (したがって修正できない) 問題が発生しています。基本的に、大きなテーブルのサブセットである場合よりも、独自のテーブルにある場合の方が、165,000 行を高速に並べ替えることができます。
テーブル fl6 には 200 万行あります。(departure_out) にインデックス x1 があります。Departure_out は日付タイプです。
次の select は、165,916 行を検索します。0.1秒かかります。
select count(*)
from fl6
where departure_out > "2013-04-01"
and departure_out < "2013-04-05";
次の select には同じ where 句がありますが、価格で並べ替えます。0.5秒かかります。165,000 行の並べ替えに 0.4 秒。
select id
from fl6
where departure_out > "2013-04-01"
and departure_out < "2013-04-05"
order by price_total limit 1;
高速化できるかどうかを確認したかったので、165,916 行だけを含む小さなテーブルを作成しました。それから私はそれについてソートしました。0.16秒かかりました。
select id
from fl6_small
order by price_total limit 1;
つまり、165,000 行をかなり高速に並べ替えることができますが、大きなテーブルのサブセットの場合は 2 倍以上の時間がかかります?? どうすればそれを行うことができますか?違いはなぜですか?
いくつかのこと:私はすでに(価格)と(departure_out、価格)にインデックスを付けようとしました。それは違いはありません。いずれにせよ、fl6_small での検索でインデックスがなくてもソートできる速度が示されている場合は、インデックスを使用する必要はありません。
編集:
(Explain Plan に使用される表に一致するように、上記の行数と時間の一部を編集しました)
説明計画:
+----+-------------+-------+-------+---------------+------+---------+------+--------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+--------+-----------------------------+
| 1 | SIMPLE | fl6 | range | x1 | x1 | 3 | NULL | 160493 | Using where; Using filesort |
+----+-------------+-------+-------+---------------+------+---------+------+--------+-----------------------------+