Средний

Чтение плана запроса (EXPLAIN)

Урок 2 из 4 в курсе Производительность баз данных

Содержание курса (2/4)

Чтение плана запроса (EXPLAIN)

EXPLAIN показывает, как именно БД собирается выполнять запрос и сколько это будет стоить.

Почему это важно: Без EXPLAIN оптимизация запросов превращается в гадание на кофейной гуще.

Главная идея

План запроса — это дерево операций (сканы, join'ы, сортировки), которое можно прочитать и улучшить.

Как это выглядит на практике

  1. Запускаем EXPLAIN ANALYZE на медленном запросе.
  2. Видим Seq Scan там, где ожидался Index Scan.
  3. Смотрим, почему индекс не используется (например, не подходит тип).
  4. Исправляем запрос или индекс — и план меняется на ожидаемый.

Что происходит под капотом

  • Seq Scan — последовательное чтение всей таблицы.
  • Index Scan — поиск по индексу с обращением к таблице.
  • Index Only Scan — чтение только из индекса (covering).
  • Nested Loop / Hash Join / Merge Join — три основных способа объединять таблицы.
  • Cost vs actual time — оптимизатор оценивает по статистике, реальное время может отличаться.

Типичные ошибки и заблуждения

  • Ошибка: EXPLAIN без ANALYZE достаточно. Без ANALYZE вы видите оценку, а не реальное время.
  • Ошибка: высокая cost = плохо. Cost — это абстрактная единица, важно сравнивать варианты.
  • Ошибка: Seq Scan — всегда плохо. На маленькой таблице он быстрее индекса.
  • Ошибка: ANALYZE на проде безопасно. Запрос реально выполнится — будьте осторожны с записью.

Ключевые выводы

  • Без EXPLAIN ANALYZE нет оптимизации.
  • План — это дерево, читай снизу вверх.
  • Сравнивай оценку и реальные строки (rows estimated vs actual).
  • Большая разница оценки и факта = устаревшая статистика.

Термины урока

Query planner — компонент СУБД, выбирающий план выполнения.
Statistics — данные о распределении значений в таблицах.
ANALYZE — команда обновления статистики.
Buffers — сколько страниц данных пришлось прочитать.

Связь с работой backend-разработчика

Умение читать EXPLAIN отличает джуна от мидла в работе с базами данных.

Мини-разбор реальной ситуации

Запрос отчёта по продажам выполнялся 30 секунд. EXPLAIN показал Nested Loop вместо Hash Join из-за устаревшей статистики. ANALYZE таблицы — и запрос стал работать за 200 мс.

Что запомнить

  • EXPLAIN ANALYZE — твой главный инструмент.
  • Читай план снизу вверх.
  • Смотри estimated vs actual rows.

Итог

EXPLAIN — это рентген базы данных. Без него вы лечите вслепую.

Комментарии к уроку

Войдите, чтобы оставить комментарий.

Пока нет комментариев — будьте первым.