ИндексыСредний
INDEX (индекс)
Структура данных, ускоряющая поиск строк по значению колонки.
Синтаксис
CREATE INDEX [CONCURRENTLY] idx_name ON table (column);
CREATE INDEX ON table (col1, col2); -- составнойОбъяснение
Индекс — как оглавление книги: позволяет найти нужные строки без полного сканирования таблицы.
По умолчанию PostgreSQL создаёт B-tree индексы. Каждый индекс:
- Ускоряет SELECT с условием по этой колонке
- Замедляет INSERT, UPDATE, DELETE (индекс нужно обновить)
- Занимает дополнительное место на диске
Пример
-- Простой индекс
CREATE INDEX ON users (email);
-- Составной (порядок важен!)
CREATE INDEX ON orders (user_id, created_at DESC);
-- Частичный — только активные
CREATE INDEX ON users (email) WHERE is_active = true;Связанные термины
B-tree индексТип индекса по умолчанию в PostgreSQL. Подходит для операций =, <, >, BETWEEN, LIKE 'prefix%'.EXPLAINПоказывает план выполнения запроса без реального выполнения — какие индексы и типы соединений выберет планировщик.Partial Index (частичный индекс)Индекс с условием WHERE — индексирует только часть строк таблицы.Составной индексИндекс по нескольким колонкам. Порядок колонок критически важен.
Анекдоты по теме
Начинающий: — Я выучил SQL за неделю! Опытный: — Поздравляю. Ты выучил SELECT, INSERT, UPDATE, DELETE. Осталось лет 5 на JOIN, индексы, транзакции и почему NULL — это зло. Удачи.
— Мой EXPLAIN показывает Seq Scan. — Добавь индекс. — Добавил. Всё равно Seq Scan. — Сколько строк в таблице? — 50. — Оптимизатор умнее тебя. При 50 строках индекс медленнее.
— Мой запрос работает 10 секунд. Как ускорить? — Покажи EXPLAIN ANALYZE. — Вот: Seq Scan, cost=0..999999. — Индекс. — Уже 0.5 секунды. — Теперь смотри на остальные узлы.