EXPLAIN в PostgreSQL: научись читать планы запросов и ускорять БД
Олег Мифле
0:00 / 0:00
EXPLAIN в PostgreSQL: научись читать планы запросов и ускорять БД
1 443 просмотра · 2 месяца назад
Олег Мифле
188 подписчиков
1 443 просмотра · 2 месяца назад
📌 ПОЛЕЗНЫЕ ССЫЛКИ:
💬 Telegram-канал: https://t.me/ask_for_oleg
📂 Мой интенсив по Sytem Design: https://mifle.courses/
Как читать EXPLAIN ANALYZE в PostgreSQL и находить настоящую причину медленного SQL-запроса? В этом видео на практическом примере разбираем план выполнения запроса, диагностируем лишнюю работу и проектируем правильный составной индекс.
Вы узнаете:
— как читать дерево EXPLAIN снизу вверх;
— чем rows отличается от actual rows;
— что показывают Index Cond, Filter и Rows Removed by Filter;
— почему наличие индекса ещё не означает хороший план;
— почему LIMIT 50 не всегда останавливает чтение после 50 строк;
— как анализировать BUFFERS, сортировку и количество обработанных данных;
— как доказать эффективность оптимизации по строкам, буферам и операциям.
В примере PostgreSQL сначала находит 50 000 строк, фильтрует и сортирует десятки тысяч записей, чтобы вернуть всего 50. Затем мы создаём индекс (tenant_id, status, created_at DESC) и сравниваем план до и после оптимизации.
Таймкоды:
0:00 — Почему EXPLAIN выглядит как шифровка
0:45 — Сценарий: стабильный запрос внезапно упал
1:15 — Схема таблицы orders и 3 миллиона строк
1:50 — Что обещает бизнес-запрос (50 последних оплаченных заказов)
2:30 — Создаём индекс по tenant_id
3:00 — Прогрев запроса перед анализом
3:30 — Как читать план: снизу вверх
4:15 — Planning time vs Execution time
4:45 — Rows (прогноз) vs Actual Rows (факт)
5:45 — Почему планировщик ошибся в 200 раз
6:30 — Первое крупное расхождение — главный маркер проблемы
7:00 — Rows Removed by Filter и цена поздней фильтрации
7:45 — Диагноз: 50K строк найдено → 40K прошло → 50 вернулось
8:15 — Почему LIMIT 50 не остановил чтение раньше
8:45 — Order By и ранняя остановка: когда это возможно
9:30 — Buffers: Shared Hits vs Shared Read
10:15 — Полная причинно-следственная цепочка
10:45 — Решение: составной индекс (tenant_id, status, created_at)
11:30 — Повторный EXPLAIN после оптимизации
12:15 — Результат: 50 строк вместо 40 тысяч
12:45 — Почему оптимизация успешна: меньше работы, а не другой план
13:30 — Система чтения EXPLAIN: 4 шага
#postgresql #explain #оптимизация