Покрывающий индекс — самый быстрый способ выбрать данные из таблицы.
Например, есть запрос, который выбирает сотрудников с указанной зарплатой:
select id, name
from employees
where salary = 90;
Если нет индекса, он обходит всю таблицу (так называемый фулскан).
Создадим индекс по зарплате:
create index employees_idx
on employees(salary);
Теперь тот же запрос будет находить записи по зарплате в индексе (это быстрее, чем обходить всю таблицу). И для каждой найденной записи будет обращаться к таблице, чтобы получить значения id и name.
Но если создать покрывающий индекс:
create index employees_idx
on employees(salary, id, name);
То запрос будет отрабатывать только по индексу, вообще без обращения к таблице. Это еще быстрее.
Покрывающие индексы дорого обходятся при изменении данных в таблице, поэтому на каждый вид запросов их создавать не стоит. Чаще это одно из последних средств оптимизации, когда все остальное уже сделали.