Составной индекс
Индекс по нескольким колонкам. Порядок колонок критически важен.
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';
Связанные термины
Анекдоты по теме
— Мой запрос работает 10 секунд. Как ускорить? — Покажи EXPLAIN ANALYZE. — Вот: Seq Scan, cost=0..999999. — Индекс. — Уже 0.5 секунды. — Теперь смотри на остальные узлы.
— Почему UUID медленнее INT как первичный ключ? — UUID случайный — вставки разбросаны по всему индексу. — INT последовательный — всегда в конец. — Насколько медленнее? — На больших таблицах B-tree страницы постоянно разбиваются. В разы медленнее INSERT. — Решение? — UUID v7 (упорядоченный по времени) или ULID — случайные, но монотонные.
— Что такое partial index? — Индекс с условием WHERE. — Зачем? — Индексируй только активных пользователей: CREATE INDEX ON users (email) WHERE is_active = true; — Экономия места и ускорение запросов по активным. — А неактивных много? — 99% базы. Классика.