0Pricing
SQL Interview Prep · Урок

Порядок столбцов составного индекса

Правило самого левого префикса и выбор подходящего порядка столбцов для рабочей нагрузки

«Порядок столбцов составного индекса» — бесплатный урок SQL Interview Prep на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL 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) и разблокировать остальной курс SQL Interview Prep, подпишись на CoddyKit PRO. Курс SQL Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «Порядок столбцов составного индекса»?

Правило самого левого префикса и выбор подходящего порядка столбцов для рабочей нагрузки Ты практикуешь SQL Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Interview Prep?

Предыдущий опыт не требуется. SQL Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Порядок столбцов составного индекса»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Interview Prep?

Да. Каждый урок SQL Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Индексы B-дерева и их преимущества
  2. Порядок столбцов составного индекса
  3. Покрывающие индексы и индексное сканирование
  4. Когда индексы вредят: записи и избирательность
← Назад к SQL Interview Prep