> Что такое составной индекс и как он работает (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 как инструмент проверки использования индекса
> Похожие задачи по PHP
Что такое анонимная функция
Что такое нормализация и денормализация баз данных
Зачем нужны блокировки в базе данных
Используете ли нативные SQL-запросы или ORM
> Похожие задачи по backend
Что такое анонимная функция
Что такое нормализация и денормализация баз данных
Зачем нужны блокировки в базе данных
Используете ли нативные SQL-запросы или ORM
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью