Составной индекс
Индекс по нескольким колонкам. Порядок колонок критически важен.
CREATE INDEX ON table (col1, col2, col3);Объяснение
Пример
-- Эффективный составной индекс
CREATE INDEX ON orders (user_id, status, created_at DESC);
-- Использует индекс:
SELECT * FROM orders WHERE user_id = 1 AND status = 'paid' ORDER BY created_at DESC;
-- НЕ использует (нет первой колонки):
SELECT * FROM orders WHERE status = 'paid';Связанные термины
Анекдоты по теме
— Мой EXPLAIN показывает Seq Scan. — Добавь индекс. — Добавил. Всё равно Seq Scan. — Сколько строк в таблице? — 50. — Оптимизатор умнее тебя. При 50 строках индекс медленнее.
— Что такое covering index? — Индекс, который содержит все нужные для запроса колонки. — Зачем? — Запрос читает только индекс, не обращаясь к таблице. Index-only scan. — Пример? — CREATE INDEX ON orders (user_id) INCLUDE (total, created_at); SELECT total, created_at FROM orders WHERE user_id = 1; — читает только индекс.
— B-tree, Hash, GIN, GiST, BRIN — как выбрать? — B-tree: всё что угодно, сравнения <, >, =. По умолчанию. — Hash: только = (редко нужен). — GIN: массивы, JSONB, full-text. — GiST: геометрия, диапазоны. — BRIN: огромные таблицы с физически упорядоченными данными (даты логов).