Составной индекс
Индекс по нескольким колонкам. Порядок колонок критически важен.
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';Связанные термины
Анекдоты по теме
— Что такое GIN индекс? — Generalized Inverted Index. Для составных типов: массивы, JSONB, full-text search. — Пример? — CREATE INDEX ON articles USING GIN (tags); SELECT * FROM articles WHERE tags @> ARRAY['sql']; — @> — это «содержит»? — Да. Без GIN — seq scan по всем тегам.
— Почему UUID медленнее INT как первичный ключ? — UUID случайный — вставки разбросаны по всему индексу. — INT последовательный — всегда в конец. — Насколько медленнее? — На больших таблицах B-tree страницы постоянно разбиваются. В разы медленнее INSERT. — Решение? — UUID v7 (упорядоченный по времени) или ULID — случайные, но монотонные.
Разработчик пишет: SELECT * FROM a JOIN b ON a.id = b.a_id JOIN c ON b.id = c.b_id JOIN d ON c.id = d.c_id JOIN e ON d.id = e.d_id JOIN f ON e.id = f.e_id DBA: ты только что создал цепочку из 6 JOIN. Разработчик: и что? DBA: надеюсь, у тебя везде есть индексы.