Покрывающий индекс SQL
Покрывающий индекс - это самый быстрый способ выбрать данные из таблицы.
Давайте посмотрим, как это работает, используя запрос, который выбирает сотрудников с определенной зарплатой:
select id, name from employees where salary = 90;
Без индекса или с использованием индекса
Если индекса нет, механизм базы данных просматривает всю таблицу (это называется «полным сканированием»):
QUERY PLAN `--SCAN employees
Создадим индекс по зарплате:
create index employees_idx on employees (salary);
Теперь движок базы данных ищет в индексе записи по зарплате (это быстрее, чем перебирать всю таблицу). И для каждой найденной записи он обращается к таблице, чтобы получить значения id
и name
:
QUERY PLAN `--SEARCH employees USING INDEX employees_idx (salary=?)
Использование покрывающего индекса
Давайте создадим покрывающий индекс (который покрывает все выбранные столбцы):
create index employees_idx on employees (salary, id, name);
Теперь движок базы данных работает только с индексом, вообще не обращаясь к таблице. Это еще быстрее:
QUERY PLAN `--SEARCH employees USING COVERING INDEX employees_idx (salary=?)
Однако простого охвата всех столбцов, используемых в запросе, может быть недостаточно. Порядок столбцов должен обеспечивать быстрый поиск по индексу.
Предположим, мы строим индекс с тем же набором столбцов, но в другом порядке:
create index employees_idx on employees (id, name, salary);
Теперь движок базы данных не сможет быстро найти записи с salary
= 90
. Он может по-прежнему использовать индекс, но это будет полное сканирование индекса вместо поиска (который медленный).
QUERY PLAN `--SCAN employees USING COVERING INDEX employees_idx
(обратите внимание на СКАНИРОВАНИЕ вместо ПОИСКА здесь)
Вывод
Покрывающие индексы стоят дороже при изменении данных в таблице, поэтому не создавайте их для каждого типа запроса. Часто это одна из последних оптимизаций после того, как сделано все остальное.