Перейти к содержимому
3 / 15

Составной индекс: как выбрать порядок колонок и когда нужны частичные и покрывающие индексы?

В составном индексе колонки упорядочены слева направо, и запрос может использовать только префикс: индекс (a, b, c) работает для условий по a, по a, b и по a, b, c, но не для запроса только по b. Практическое правило порядка: сначала колонки, по которым идёт равенство, затем — по которым диапазон, затем — по которым сортировка. Колонка после диапазонного условия перестаёт сужать поиск, поэтому (status, created_at) работает, а (created_at, status) для запроса «pending за неделю» — почти нет. Частичный индекс (WHERE status = 'pending') убирает из индекса ненужные строки: он меньше, дешевле в обслуживании и часто радикально быстрее, когда запросы всегда касаются малой доли таблицы. Покрывающий (INCLUDE (...)) добавляет колонки в листья без участия в сортировке, чтобы запрос обошёлся index-only scan и не ходил в таблицу — при условии, что карта видимости актуальна, то есть таблица регулярно вакуумируется.

Составной индекс: как выбрать порядок колонок и когда нужны частичные и покрывающие индексы? | JScriptiser