ИндексыПродвинутый
Составной индекс
Индекс по нескольким колонкам. Порядок колонок критически важен.
Синтаксис
CREATE INDEX ON table (col1, col2, col3);Объяснение
Составной индекс по (a, b, c) работает для условий: WHERE a=..., WHERE a=... AND b=..., WHERE a=... AND b=... AND c=... Но НЕ работает для WHERE b=... без a.
Правило левого префикса: запрос должен включать первые N колонок индекса по порядку.
Порядок: сначала колонки равенства (=), потом диапазона (<, >). INDEX(status, created_at) быстрее для WHERE status='paid' AND created_at > '2024-01-01'.
Пример
-- Эффективный составной индекс
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';Связанные термины
Анекдоты по теме
Разработчик пишет: 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: надеюсь, у тебя везде есть индексы.
— Мой запрос работает 10 секунд. Как ускорить? — Покажи EXPLAIN ANALYZE. — Вот: Seq Scan, cost=0..999999. — Индекс. — Уже 0.5 секунды. — Теперь смотри на остальные узлы.
Индекс говорит таблице: — Милая, я ускоряю твои SELECT-ы в 1000 раз! Таблица вздыхает: — А я из-за тебя при каждом INSERT-е торможу. Индекс: — Ничего, я кластерный. Без меня ты просто куча мусора на диске.