Ответ
Поля в составном индексе следует перечислять в порядке убывания селективности (от наиболее уникальных к наименее уникальным) и с учетом типичных запросов.
Почему?
- Селективность: Наиболее селективное поле (например,
user_id) быстро отфильтровывает большую часть данных, уменьшая объем для последующей фильтрации. - Порядок в WHERE: Индекс эффективно используется, если запрос фильтрует по префиксу индекса. Индекс
(A, B, C)подходит дляWHERE A=1 AND B=2, но не дляWHERE B=2.
Пример (PostgreSQL):
-- Плохо: status имеет низкую селективность (всего 3-4 значения)
CREATE INDEX idx_bad ON orders (status, user_id, created_at);
-- Хорошо: user_id высокоселективен, часто используется в фильтрах
CREATE INDEX idx_good ON orders (user_id, status, created_at);
-- Запрос, который эффективно использует idx_good:
SELECT * FROM orders
WHERE user_id = 12345 AND status = 'shipped'
ORDER BY created_at DESC;
-- Индекс обеспечит быструю фильтрацию по user_id, затем по status и сортировку по created_at.
Дополнительно: Также важно учитывать поля, используемые в ORDER BY или JOIN. Индекс может покрывать запрос (covering index), если включает все выбираемые поля.