in句とorder by を使用した場合に複合indexが使われていてもfile sortが発生してしまう
以下のようなテーブルがに対してid, positionで複合indexを追加します。
+------+----------+
| id | position |
+------+----------+
| 1 | 1 |
| 2 | 2 |
| 3 | 5 |
| 4 | 4 |
+------+----------+
show index from test;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| test | 1 | idx | 1 | id | A | 4 | NULL | NULL | YES | BTREE | | |
| test | 1 | idx | 2 | position | A | 4 | NULL | NULL | YES | BTREE | | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
この状態で以下のようなクエリを発行すると複合indexが使われているように見えますがfilesortが発生してしまいます。なぜfilesortが発生してしまうのでしょうか?また、filesortを回避する方法はありますでしょうか?
mysql> explain
-> select
-> *
-> from
-> test
-> where
-> id in (1,3,4)
-> order by position;
+----+-------------+-------+-------+---------------+------+---------+------+------+------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+------+------------------------------------------+
| 1 | SIMPLE | test | range | idx | idx | 5 | NULL | 3 | Using where; Using index; Using filesort |
+----+-------------+-------+-------+---------------+------+---------+------+------+------------------------------------------+