ИндексыСредний
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 / EXPLAIN ANALYZEEXPLAIN показывает план выполнения запроса. EXPLAIN ANALYZE выполняет запрос и показывает реальное время.Partial Index (частичный индекс)Индекс с условием WHERE — индексирует только часть строк таблицы.Составной индексИндекс по нескольким колонкам. Порядок колонок критически важен.
Анекдоты по теме
— Почему запрос без индекса похож на поиск книги в библиотеке? — Потому что приходится читать каждую страницу каждой книги.
— Почему оптимизатор иногда выбирает плохой план? — Устаревшая статистика. Запусти ANALYZE. — Или: очень нетипичное распределение данных. — Или: коррелированные условия WHERE — оптимизатор считает их независимыми. — Решение? — CREATE STATISTICS ON (a, b) FROM table; — многоколоночная статистика.
Таблица на 10 строк: всё работает молниеносно. Таблица на 10 000 строк: всё ещё быстро. Таблица на 10 000 000 строк: добавь индексы. Таблица на 10 000 000 000 строк: пора поговорить о партиционировании.