mysql нужны ли дополнительные индексы для запросов на подмножестве существующего индекса? - PullRequest
0 голосов
/ 04 мая 2020

Если у меня есть индекс на 4 столбца:

CREATE TABLE mytable (
   from varchar(20) NOT NULL,
   to varchar(20) NOT NULL,
   departure date NOT NULL,
   arrival date NOT NULL,
   ....
   KEY mykey(from, to, departure, arrival)
);

Когда я делаю запрос на равенство только на from и to, я должен был бы создать дополнительный индекс KEY fromto (from, to), чтобы что mysql использует индекс для сканирования?

Или mysql повторно использует существующий индекс, поскольку я запрашиваю только его подмножество с помощью SELECT * from mytable where from = 'New' and to = 'York'? Или даже только запрос на ...from = 'New'?

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

Mysql документация говорит;

Если таблица имеет индекс из нескольких столбцов, any leftmost prefix of the index can be used оптимизатором для поиска строк. Например, если у вас есть индекс из трех столбцов (col1, col2, col3), у вас есть индексированные возможности поиска для (col1), (col1, col2) и (col1, col2, col3).

Вы можете использовать explain, чтобы увидеть, используется индекс или нет.

mysql> explain select * from mytable where `from` = 'a' and `to` = 'b';
+----+-------------+---------+------------+------+---------------+-------+---------+-------------+------+----------+-------------+
| id | select_type | table   | partitions | type | possible_keys | key   | key_len | ref         | rows | filtered | Extra       |
+----+-------------+---------+------------+------+---------------+-------+---------+-------------+------+----------+-------------+
|  1 | SIMPLE      | mytable | NULL       | ref  | mykey         | mykey | 164     | const,const |    1 |   100.00 | Using index |
+----+-------------+---------+------------+------+---------------+-------+---------+-------------+------+----------+-------------+
1 row in set, 1 warning (0.02 sec)
0 голосов
/ 04 мая 2020

Нет, вам не нужен дополнительный индекс. Пока можно использовать префиксную часть индекса, индекс можно использовать.

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

(с)

(с, до)

(с, до, отправление)

(с, до, отправление, прибытие)

в любом порядке.

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