Ответ вслух Senior Индексы обновлено

Порядок колонок в составном индексе

Вопрос

Как выбрать порядок колонок в составном индексе? Разбери на примере WHERE tenant_id = ? AND status = ? AND created_at > ? ORDER BY created_at.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Индекс отсортирован по первой колонке, внутри по второй и так далее, поэтому работает левый префикс. Правило: сначала колонки, по которым равенство, потом одна колонка с диапазоном или сортировкой.

Что должно прозвучать в ответе

  • Индекс работает по левому префиксу: ведущие колонки должны быть в условии

  • Сначала колонки с равенством, затем одна колонка с диапазоном или сортировкой

  • После колонки с диапазоном следующие колонки для поиска уже не помогают

  • Для примера: (tenant_id, status, created_at) закрывает и фильтр, и ORDER BY

  • Учитывать, какие ещё запросы обслужит индекс, чтобы не плодить похожие

  • Проверять на реальных данных через EXPLAIN ANALYZE

Что могут спросить следом

  • Почему «самую селективную колонку первой» не всегда верно?
  • Когда вместо составного индекса лучше частичный?

Разбор

Индекс отсортирован по первой колонке, внутри по второй и так далее, поэтому работает левый префикс. Правило: сначала колонки, по которым равенство, потом одна колонка с диапазоном или сортировкой. В примере tenant_id и status сравниваются на равенство, created_at и в диапазоне, и в сортировке, поэтому индекс (tenant_id, status, created_at): база спускается к нужному арендатору и статусу и читает даты уже по порядку, без отдельной сортировки. Если поставить created_at вперёд, равенства по остальным колонкам придётся проверять фильтром по большому диапазону. Совет «самую селективную колонку первой» вторичен: важнее, какие запросы обслуживает индекс, например тот же индекс подойдёт и для WHERE tenant_id = ?. Если статус почти всегда один и тот же, например new, удобнее частичный индекс (tenant_id, created_at) WHERE status = 'new'. В конце проверяю план на реальных объёмах.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.