Ответ
Да, порядок полей в составном индексе критически важен для производительности. Индекс используется эффективно только для запросов, которые фильтруют или сортируют по префиксу (левой части) списка полей индекса.
Как это работает:
Индекс (A, B, C) упорядочивает записи сначала по A, затем по B, и затем по C. Поэтому он может быть использован для поиска по (A), (A, B) или (A, B, C), но не по (B) или (B, C) напрямую.
Пример для индекса CREATE INDEX idx ON orders(status, customer_id, created_at):
-- ИНДЕКС БУДЕТ ИСПОЛЬЗОВАН ПОЛНОСТЬЮ (Все поля в условии)
SELECT * FROM orders
WHERE status = 'shipped' AND customer_id = 123 AND created_at > '2024-01-01';
-- ИНДЕКС БУДЕТ ИСПОЛЬЗОВАН ЧАСТИЧНО (По префиксу status, customer_id)
SELECT * FROM orders WHERE status = 'shipped' AND customer_id = 123;
-- ИНДЕКС БУДЕТ ИСПОЛЬЗОВАН ЧАСТИЧНО (Только по первому полю status)
SELECT * FROM orders WHERE status = 'shipped';
-- ИНДЕКС НЕ БУДЕТ ИСПОЛЬЗОВАН ДЛЯ ФИЛЬТРАЦИИ (Пропущено поле status)
SELECT * FROM orders WHERE customer_id = 123; -- Полный scan таблицы
Правила для определения порядка полей:
- Поля с условиями равенства (
=,IN) должны идти первыми. - Поля, используемые для сортировки (
ORDER BY), идут следующими. - Поля с диапазонными условиями (
>,<,BETWEEN,LIKE 'prefix%') ставятся в конец индекса.
Вывод: Составной индекс — это не просто набор полей, а упорядоченный список. Правильный порядок определяет, сможет ли СУБД использовать индекс для ускорения конкретного запроса.