Порядок столбцов составного индекса
Правило самого левого префикса и выбор подходящего порядка столбцов для рабочей нагрузки
«Порядок столбцов составного индекса» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.
Вопрос о составном индексе
Когда Вы уже умеете объяснять индекс по одному столбцу, интервьюеры повышают сложность: «Вы выполняете запрос по customer_id и order_date вместе. Как бы Вы проиндексировали эти столбцы?» Ожидаемый ответ — составной индекс (по нескольким столбцам) и обоснование порядка столбцов.
На этом уроке Вы изучите правило левого префикса — единственную идею, которая объясняет почти любой вопрос о составных индексах.
Что такое составной индекс
Составной индекс индексирует несколько столбцов как упорядоченный кортеж. Записи сначала сортируются по первому столбцу, затем при одинаковых значениях — по второму и так далее, точно как телефонный справочник, отсортированный сначала по фамилии, а затем по имени.
Порядок чрезвычайно важен, потому что приоритет сортировки определяется порядком объявленных столбцов.
CREATE INDEX idx_orders_cust_date
ON orders (customer_id, order_date);Правило левого префикса
Основное правило: составной индекс по (A, B, C) можно использовать в запросах, которые фильтруют по левому префиксу этих столбцов:
- только
A— да A, B— даA, B, C— да- только
B— NO B, C— NO
Представьте телефонный справочник: Вы можете найти всех людей с фамилией «Смит», но не можете эффективно найти всех людей с именем «Джон» независимо от фамилии, потому что справочник отсортирован не таким образом.
Разбор примера: совпадения по префиксу
Индекс по (customer_id, order_date) можно использовать для этих запросов, поскольку они начинаются с customer_id:
В первом используется только ведущий столбец. Во втором используются оба столбца: сначала поиск сужается по customer_id, а затем выполняется поиск среди записей этого клиента, отсортированных по дате.
-- Uses the index (leading column)
SELECT * FROM orders WHERE customer_id = 42;
-- Uses the index fully (both columns, in order)
SELECT * FROM orders
WHERE customer_id = 42
AND order_date >= '2026-01-01';Разбор примера: несовпадение с префиксом
Этот запрос фильтрует только по второму столбцу, поэтому индекс по (customer_id, order_date) обычно не может управлять поиском: записи не отсортированы глобально по order_date.
Если фильтрация только по order_date — распространённый сценарий, Вам нужен отдельный индекс, начинающийся с order_date.
-- Does NOT use idx_orders_cust_date efficiently
SELECT * FROM orders
WHERE order_date >= '2026-01-01';
-- Fix: an index that leads with order_date
CREATE INDEX idx_orders_date ON orders (order_date);Равенство перед диапазоном
Уточнение для уровня опытного специалиста: помещайте столбцы, используемые с равенством (=), перед столбцами, используемыми с диапазоном (<, >, BETWEEN). Как только индекс доходит до столбца диапазона, он больше не может использовать последующие столбцы для сужения поиска.
Для запроса вроде status = 'paid' AND created_at > ? правильный порядок — (status, created_at), а не обратный.
-- Query: WHERE status = 'paid' AND created_at > '2026-01-01'
-- Good: equality column first
CREATE INDEX idx_orders_status_created
ON orders (status, created_at);Выбор ведущего столбца
Как выбрать столбец, который будет первым? Интервьюеры ожидают ответа, основанного на рабочей нагрузке:
- Ставьте первым столбец, который встречается в наибольшем числе запросов, особенно в качестве фильтра с проверкой на равенство.
- Предпочитайте столбец с высокой селективностью (большим количеством различных значений), чтобы первый шаг исключал максимум строк.
- Учитывайте требования ORDER BY: соответствие порядка индекса может позволить избежать сортировки.
Ведущий столбец — тот, который выполняет самую тяжёлую работу по фильтрации в реальном наборе Ваших запросов.
Составной индекс помогает сортировать
Составной индекс также обслуживает ORDER BY по левому префиксу. Поскольку записи отсортированы сначала по customer_id, а затем по order_date, запрос заказов одного клиента с сортировкой по дате практически не требует затрат: отдельная сортировка не нужна.
-- No sort step: the index already supplies this order
SELECT * FROM orders
WHERE customer_id = 42
ORDER BY order_date;Не создавайте избыточные индексы
Кандидаты часто создают слишком много индексов. Если у Вас уже есть (customer_id, order_date), отдельный индекс только по (customer_id) обычно избыточен: составной индекс уже охватывает запросы по ведущему столбцу.
Каждый дополнительный индекс требует места и замедляет операции записи, поэтому цель — создать минимальный набор индексов, охватывающий используемые шаблоны запросов, а не отдельный индекс для каждого столбца.
Подтверждение с помощью EXPLAIN
Как всегда, подтвердите выбор планировщика. После создания составного индекса запустите EXPLAIN и проверьте, отображается ли он как Index Scan и сколько строк оценивается.
Если запрос, не соответствующий префиксу, переходит к последовательному сканированию, это подтверждает, что порядок столбцов не подходит рабочей нагрузке; именно это Вы и объяснили бы интервьюеру.
EXPLAIN
SELECT * FROM orders
WHERE customer_id = 42
AND order_date >= '2026-01-01';Как сформулировать ответ на собеседовании
Краткая формулировка:
«Составной индекс сортируется по своим столбцам слева направо, поэтому он может обслуживать любой левый префикс этих столбцов, но не только последующие столбцы. Я ставлю первым столбец с наиболее активной фильтрацией и высокой селективностью, помещаю предикаты равенства перед предикатами диапазона и по возможности согласую порядок с ORDER BY, а затем проверяю результат с помощью EXPLAIN».
Быстрая проверка
Примените правило крайнего левого префикса.
Итоги: порядок составного индекса
Главные выводы:
- Составной индекс сортируется слева направо; он обслуживает только крайний левый префикс своих столбцов.
- Первым ставьте столбец с наиболее частыми запросами и высокой селективностью.
- Столбцы, проверяемые на равенство, ставьте перед столбцами для диапазона.
- Совпадающий префикс также может обслужить
ORDER BYбез отдельной сортировки. - Избегайте избыточных одностолбцовых индексов, уже покрытых составным индексом, и проверяйте результат с помощью
EXPLAIN.
Далее — покрывающие индексы, полностью устраняющие извлечение из кучи.
Часто задаваемые вопросы
Урок «Порядок столбцов составного индекса» бесплатный?
Да — полный текст урока «Порядок столбцов составного индекса» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «Порядок столбцов составного индекса»?
Правило самого левого префикса и выбор подходящего порядка столбцов для рабочей нагрузки Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Coding Interview Prep?
Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Порядок столбцов составного индекса»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Coding Interview Prep?
Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Индексы B-дерева и их преимущества
- Порядок столбцов составного индекса
- Покрывающие индексы и индексное сканирование
- Когда индексы вредят: записи и избирательность