У меня есть следующая таблица
CREATE TABLE `test` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`a` int(11) NOT NULL,
`b` int(11) NOT NULL
);
И мне нужно сделать следующий запрос
SELECT * FROM `test` ORDER BY a, b LIMIT 1;
Если я добавляю составной индекс
ALTER TABLE `t_test` ADD INDEX a_b(`a`, `b`);
Работает
> EXPLAIN SELECT * FROM `test` ORDER BY a, b LIMIT 1;
+------+-------------+-------+-------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+-------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | test | index | NULL | a_b | 8 | NULL | 1 | |
+------+-------------+-------+-------+---------------+------+---------+------+------+-------+
Но если я добавлю два индекса отдельно
ALTER TABLE `t_test` ADD INDEX a(`a`), ADD INDEX b(`b`);
Не удается
> EXPLAIN SELECT * FROM `test` ORDER BY a, b LIMIT 1;
+------+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | test | ALL | NULL | NULL | NULL | NULL | 2 | Using filesort |
+------+-------------+-------+------+---------------+------+---------+------+------+----------------+
Даже если я добавлю FORCE INDEX
, это не сработает.
Как я понимаю, он должен использовать как index a
, так и index b
и только немного меньше, чем составной индекс.
Даже если я ошибаюсь, сначала нужно хотя бы использовать index a
, а затем использовать сортировку файлов для сортировки b.
Разве этот оператор сортировки не может использовать отдельные индексы? Если да, пожалуйста, объясните, почему это не работает. Если нет, есть ли у вас какое-либо решение, позволяющее работать с отдельными индексами? Заранее спасибо.
EDIT
Например, у меня есть 100 строк. Я могу сначала использовать index a
, чтобы отсортировать их. И затем в каждой группе с одинаковым значением a
я могу использовать index b
для их сортировки.
Почему этот способ не работает на MySQL?