Базы данных

PostgreSQL: индексы, которые действительно работают

Ruslan Ismailov Опубликовано Обновлено 11 мин чтения
P

Индекс — это компромисс

Любой индекс ускоряет чтение, но замедляет запись и занимает место. Поэтому индексы добавляют не «на всякий случай», а под конкретные запросы, подтверждённые планом выполнения.

Читаем план запроса

EXPLAIN ANALYZE показывает, как именно база выполняет запрос: использует ли индекс, делает ли последовательное сканирование, сколько строк отбрасывает. Это главный инструмент диагностики медленных запросов.

На что смотреть в плане

  • Seq Scan на большой таблице там, где ожидался индекс.
  • Большая разница между оценкой и фактическим числом строк — устаревшая статистика.
  • Дорогая сортировка, которую мог бы закрыть индекс.

Выбираем тип индекса

B-tree подходит для равенства и диапазонов и покрывает большинство случаев. GIN незаменим для JSONB и полнотекстового поиска. Частичные индексы экономят место, индексируя только нужное подмножество строк, а покрывающие индексы позволяют отвечать на запрос, не обращаясь к таблице.

Частые ошибки

Дублирующие индексы, индексы по столбцам с низкой селективностью и забытое обслуживание статистики — типичные причины того, что индексы не помогают. Регулярный анализ и пересмотр индексов под реальные запросы возвращают им пользу.

Итоги

Эффективное индексирование — это дисциплина измерений: смотрим план, добавляем точечный индекс, проверяем результат и удаляем то, что не приносит пользы.

Технологии

Теги

Руслан Исмаилов

Senior Web / Backend разработчик. Senior web/backend разработчик с 9-летним опытом. Стек: PHP, Laravel, PostgreSQL, Redis, Docker, Kubernetes, REST, микросервисы, CI/CD. Подробнее обо мне →