> Что такое составной индекс и как он работает (PHP)

Уровень: junior · Роль: backend · Язык: PHP · Категория: Технические вопросы

Компании: vanta

Стек: PHP, Java

> Пример ответа

Короткий ответ

Составной индекс - это индекс, построенный по двум и более колонкам таблицы. Он работает по принципу "левостороннего префикса": запрос может эффективно использовать индекс, если условия затрагивают колонки слева направо, начиная с первой. Порядок колонок в индексе критичен - он определяет, какие комбинации условий будут ускорены. В PHP и Java это одинаково важно для оптимизации запросов к БД.

Подробное объяснение

Составной индекс в реляционной БД - это структура данных (обычно B-tree), которая хранит отсортированные значения нескольких колонок. Каждая запись индекса содержит комбинацию значений этих колонок, а также ссылку на строку таблицы.

Ключевая особенность - правило левостороннего префикса. Индекс по колонкам (a, b, c) эффективно работает для:

  • условий по a
  • условий по a и b
  • условий по a, b и c

Но он не ускорит запрос с условием только по b или только по c. Это ограничение нужно учитывать при проектировании.

Порядок колонок определяется селективностью: чем более уникальные значения, тем ближе к началу должна стоять колонка. Также важно учитывать типичные запросы - индекс строится под конкретные паттерны доступа.

Составной индекс также помогает в сортировке и группировке, если порядок колонок совпадает с ORDER BY или GROUP BY.

На практике

При работе с PHP (например, с MySQL через PDO) составной индекс часто применяется для:

  • фильтрации по нескольким полям одновременно (например, user_id и status)
  • покрытия запросов, когда все нужные колонки есть в индексе - тогда БД не обращается к таблице
  • оптимизации JOIN-ов по нескольким ключам

В Java (например, с JPA/Hibernate) важно помнить, что аннотации @Index на уровне сущности создают индексы, но порядок колонок задается вручную. Также нужно следить, чтобы запросы реально использовали созданные индексы - для этого смотрят план выполнения через EXPLAIN.

Пример кода

SQL
-- Создание составного индекса
CREATE INDEX idx_user_status ON orders (user_id, status);
-- Эффективные запросы
SELECT * FROM orders WHERE user_id = 42;
SELECT * FROM orders WHERE user_id = 42 AND status = 'paid';
-- Неэффективный запрос (индекс не используется)
SELECT * FROM orders WHERE status = 'paid';
PHP
// PHP с PDO - запрос, который использует составной индекс
$stmt = $pdo->prepare("SELECT * FROM orders WHERE user_id = ? AND status = ?");
$stmt->execute([42, 'paid']);
JAVA
// Java с JPA - создание составного индекса
@Entity
@Table(name = "orders", indexes = {
@Index(name = "idx_user_status", columnList = "user_id, status")
})
public class Order {
// поля
}

Как отвечать на собеседовании

Начни с определения: составной индекс - это индекс по нескольким колонкам. Затем объясни правило левостороннего префикса на простом примере. Подчеркни, что порядок колонок - главный trade-off: он определяет, какие запросы будут ускорены. Упомяни, что индекс помогает не только в WHERE, но и в ORDER BY и JOIN. Если спросят про покрывающий индекс - скажи, что это частный случай, когда все нужные колонки есть в индексе. Не углубляйся в внутренности B-tree, если не просят.

Что проверяет интервьюер

Интервьюер проверяет:

  • понимание принципа левостороннего префикса
  • умение объяснить, почему порядок колонок важен
  • знание, когда составной индекс полезен, а когда нет
  • способность привести пример из реальной практики
  • понимание связи между индексом и планом выполнения запроса

Типичные ошибки

  • Утверждение, что индекс по (a, b) ускоряет запросы только по b - это неверно
  • Игнорирование селективности при выборе порядка колонок
  • Создание составного индекса вместо нескольких одиночных без анализа запросов
  • Забывают, что составной индекс занимает больше места и замедляет INSERT/UPDATE
  • Путаница между составным индексом и покрывающим индексом - это разные вещи
  • Не упоминают EXPLAIN как инструмент проверки использования индекса

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью