ИндексыСредний
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 — индексирует только часть строк таблицы.Составной индексИндекс по нескольким колонкам. Порядок колонок критически важен.
Анекдоты по теме
Что сказал один индекс другому? — Ты меня ускоряешь, но когда дело доходит до вставки, ты просто тормоз!
— Зачем нужен EXPLAIN (BUFFERS)? — Показывает, сколько данных прочитано из кэша и с диска. — Зачем это знать? — Если всё из кэша — ок. Если много с диска — нужно больше shared_buffers или индексы.
В баре сидит DBA. К нему подходит молодой разработчик: — Я написал запрос на 500 строк. Там 12 уровней вложенных подзапросов, кросс-джойн на 8 таблиц, оконные функции внутри WHERE, а потом GROUP BY на хэш-таблицу с миллиардом строк. Он выполняется 3 дня. Как оптимизировать? DBA, не поднимая глаз от виски: — Очень просто. Пиши: TRUNCATE TABLE career_results. И иди в менеджеры.