Почему MySQL использует только составной индекс, а не отдельные индексы? - PullRequest
0 голосов
/ 17 января 2019

У меня есть следующая таблица

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?

1 Ответ

0 голосов
/ 17 января 2019

Когда для «сортировки» используется индекс (составной или нет), MySQL читает данные по порядку и не выполняет сортировку вообще. Это невозможно с несколькими индексами.

Возможно упорядоченное чтение по первому индексу, а затем сортировка файлов, но вряд ли это будет быстрее, поэтому MySQL этого не делает.

Если вам действительно нужно это сделать, вы можете использовать такой подзапрос, как этот:

    SELECT ...
    FROM (
            SELECT primary_key
            FROM table1
            ORDER BY field1
            LIMIT 15
    ) tmp
    JOIN table1 t ON t.primary_key = tmp.primary_key
    ORDER BY field1, field2

Это может быть полезно, если у вас есть LIMIT и по какой-то причине вы не можете добавить составной индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...