ИндексыПродвинутый
Составной индекс
Индекс по нескольким колонкам. Порядок колонок критически важен.
Синтаксис
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';
Связанные термины
EXPLAIN / EXPLAIN ANALYZEEXPLAIN показывает план выполнения запроса. EXPLAIN ANALYZE выполняет запрос и показывает реальное время.INDEX (индекс)Структура данных, ускоряющая поиск строк по значению колонки.Partial Index (частичный индекс)Индекс с условием WHERE — индексирует только часть строк таблицы.
Анекдоты по теме
— Есть ли NULL в индексе? — В PostgreSQL — нет. B-tree индекс по умолчанию не индексирует NULL. — А если WHERE col IS NULL? — Seq Scan. Если нужен индекс на NULL — используй partial index: WHERE col IS NULL.
— Как понять, что ты начинающий? — Ты ставишь LIMIT 10, а база всё равно думает минуту. Опытный ставит правильный индекс и не ждёт.
— Зачем вы добавили индекс на каждую колонку? — Чтобы всё было быстро! — SELECT стал быстрее на 10%. — Отлично! — INSERT теперь занимает 30 секунд. — ...