Почему в составном индексе важен порядок колонок?
- Что такое правило левого префикса?
- Как выбрать порядок колонок в составном индексе?
Составной индекс (a, b) отсортирован сначала по a, затем по b — как телефонный справочник по фамилии и имени. Поэтому он помогает в поиске по a и по a + b, но не по одному b.
- Правило левого префикса: используется начало списка колонок
- Колонки с равенством — первыми, с диапазоном или сортировкой — после
- Индекс
(user_id, created_at)закрываетWHERE user_id = ? ORDER BY created_at DESC LIMIT 20
А ещё Покрывающий индекс (INCLUDE) — запрос обслуживается без чтения таблицы
Подробно
Почему порядок важен. B-дерево по (a, b) хранит пары, упорядоченные по a, а при равных a — по b. Найти все строки с a = 5 — один диапазон в индексе. Найти все строки с b = 7 — значения разбросаны по всему индексу, и база выберет полный просмотр (PostgreSQL иногда сканирует весь индекс или использует skip scan в новых версиях, но это дорого).
Как выбирать порядок:
- колонки, которые сравниваются на равенство, — первыми;
- затем колонка диапазона (
created_at > ...) или сортировки — после диапазонной колонки следующие колонки уже не сужают поиск; - смотреть на реальные запросы: один индекс
(user_id, status, created_at)может обслужить несколько запросов, начинающихся сuser_id; - при прочих равных — более селективные колонки раньше.
Покрывающий индекс — включает все колонки, нужные запросу (INCLUDE в PostgreSQL), и запрос выполняется только по индексу (Index Only Scan).
Лишние индексы: индекс (a) не нужен, если есть (a, b) — левый префикс покрывает поиск по a.
Пример
CREATE INDEX ON orders (customer_id, created_at DESC);
SELECT * FROM orders WHERE customer_id = 42 ORDER BY created_at DESC LIMIT 20; -- индекс целиком
SELECT * FROM orders WHERE created_at > now() - interval '1 day'; -- этот индекс не подходитЧто хотят услышать
- Как упорядочен составной индекс.
- Правило левого префикса с примером.
- Порядок: равенство, затем диапазон и сортировка.
- Покрывающие индексы и лишние индексы — плюс.
Частые ошибки
- Ожидать, что индекс
(a, b)ускорит поиск только поb. - Ставить колонку диапазона перед колонкой равенства.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Порядок колонок вообще не влияет на использование индекса
- ✓B-tree эффективно использует только левый префикс индекса
- ✗Оптимизатор сам переставляет колонки индекса под запрос, порядок важен лишь при создании
- ✗Порядок колонок определяет уникальность строк
Что спросят дальше
- Что такое covering index?
- Как EXPLAIN показывает использование индекса?
Разбор темы
- Индексы и планы запросов
Устройство B-tree, hash vs B-tree, составной и covering индекс, цена записи и когда индекс не используется.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.