クエリの 1 つが遅い理由とそれを修正する方法を理解しようとしていますが、結果に少し困惑しています。
orders
約80列と775179行のテーブルがあり、次のリクエストを行っています:
SELECT * FROM orders WHERE id_state = 2 AND id_mp IS NOT NULL ORDER BY creation_date DESC LIMIT 200
4.5秒で38行を返します
を削除するORDER BY
と、素晴らしい改善が得られます:
SELECT * FROM orders WHERE id_state = 2 AND id_mp IS NOT NULL LIMIT 200
0.30 秒で 38 行
しかし、LIMIT
に触れずにを削除するORDER BY
と、さらに良い結果が得られます:
SELECT * FROM orders WHERE id_state = 2 AND id_mp IS NOT NULL ORDER BY creation_date DESC
0.10 秒で 38 行 (??)
なぜ私の LIMIT はそんなにお腹がすいているのですか?
もっと遠く行く
回答を送信する前にいくつかのことを試していましたが、インデックスがあることに気付いた後creation_date
(これは ですdatetime
)、それを削除し、最初のクエリは 0.10 秒で実行されるようになりました。何故ですか ?
編集
いいと思いますが、where の他の列部分にインデックスがあります。
mysql> explain SELECT * FROM orders WHERE id_state = 2 AND id_mp IS NOT NULL ORDER BY creation_date DESC LIMIT 200;
+----+-------------+--------+-------+------------------------+---------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+------------------------+---------------+---------+------+------+-------------+
| 1 | SIMPLE | orders | index | id_state_idx,id_mp_idx | creation_date | 5 | NULL | 1719 | Using where |
+----+-------------+--------+-------+------------------------+---------------+---------+------+------+-------------+
セットで 1 行 (0.00 秒)
mysql> explain SELECT * FROM orders WHERE id_state = 2 AND id_mp IS NOT NULL ORDER BY creation_date DESC;
+----+-------------+--------+-------+------------------------+-----------+---------+------+-------+----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+------------------------+-----------+---------+------+-------+----------------------------------------------------+
| 1 | SIMPLE | orders | range | id_state_idx,id_mp_idx | id_mp_idx | 3 | NULL | 87502 | Using index condition; Using where; Using filesort |
+----+-------------+--------+-------+------------------------+-----------+---------+------+-------+----------------------------------------------------+