@yuriy2

Важен ли порядок столбцов в индексе Mysql при поиске Where?

Добрый день! Изучаю индексы. В литературе и интернете пишут, что при наличии многоколоночного индекса важен порядок в Where (левая часть индекса), иначе индекс может быть не использован вообще.
Пример, есть индекс abc.

Везде пишут такие примеры:
Select a from table where a=10, b= 20 - будет использовать индекс.
Select a from table where a=10 - будет использовать индекс.
Select a from table where b= 20 - НЕ будет использовать индекс.
Select a from table where a=10, с= 30 - будет использовать индекс но только по полю а.
Select a from table where b= 20, с=30 - НЕ будет использовать индекс.

Провожу эксперимент:

create table ind (
`id` int(3) not null auto_increment,
`a` varchar(32) not null,
`b` varchar(32) not null,
`c` varchar(32) not null,
primary key(`id`));


Создаем индекс

create index idx_abc on ind(a,b,c);


Запрос:

explain select a from ind where c='test4'\G;

В результате explain поясняет, что использован индекс для запроса, хотя по идее не должен

id: 1
select_type: SIMPLE
table: ind
partitions: NULL
type: index
possible_keys: NULL
key: idx_abc
key_len: 294
ref: NULL
rows: 7
filtered: 14.29
Extra: Using where; Using index


Вопрос: важен ли порядок столбцов в индексе при поиске при поиске Where?
  • Вопрос задан
  • 3174 просмотра
Пригласить эксперта
Ответы на вопрос 2
AlexMcArrow
@AlexMcArrow
Люблю РНР, да я такой!
Здесь create index idx_abc on ind(a,b,c); вы создаете составной индекс
Здесь ваш запрос explain select a from ind where c='test4' использует часть индекса => индекс используется
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В вашем примере речь идёт, скорее, не о порядке сравнений во WHERE, а о порядке колонок в индексе.
При поиске используется только начальная часть составного индекса. То есть индекс (a, b, c) можно использовать при поиске по a, ab или abc. Поиск по b, c или bc использовать такой составной индекс не будет.

Обратите внимание на строчку 'rows' в ответе EXPLAIN'a, подозреваю, что у вас в таблице всего семь строк, а значит запрос просмотрел их все, не воспользовавшись индексом.

Эврика! Здесь говорится, что в случае покрывающего индекса (а здесь именно такой случай) записи индекса используются для ускорения доступа к данным при переборе, так как записи индекса, в общем случае, занимают меньше места и расположены компактнее, чем записи самой таблицы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы