Порядок колонок в составном индексе
Вопрос
Как выбрать порядок колонок в составном индексе? Разбери на примере 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 ошибок.