Запрос тормозит на проде
Вопрос
Пользователи жалуются, что страница заказов стала открываться 5 секунд. Ты подозреваешь базу. Твои действия по шагам.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Подтвердить, что дело в базе: метрики, логи медленных запросов, pg_stat_statements
Получить точный запрос с параметрами и выполнить EXPLAIN (ANALYZE, BUFFERS) на копии или осторожно на проде
Читать план: где основное время, оценка строк против факта, тип сканов и соединений, сортировки на диске
Гипотезы: нет индекса, функция над колонкой, устаревшая статистика, большой OFFSET, N+1 в коде
Исправление и проверка эффекта (план и время после), индекс через CONCURRENTLY
Что поменялось: релиз, рост данных, блокировки, раздувание таблиц
Что могут спросить следом
- Что делать, если на копии запрос быстрый, а на проде медленный?
- Как понять, что запрос ждёт блокировку, а не работает?
Разбор
Сначала убеждаюсь, что виновата база: смотрю метрики приложения и время запросов, pg_stat_statements и лог медленных запросов, нахожу конкретный запрос. Заодно проверяю pg_stat_activity: если запрос висит в ожидании блокировки, дело не в плане. Потом беру запрос с реальными параметрами и смотрю EXPLAIN (ANALYZE, BUFFERS), на проде осторожно и только для чтения. В плане ищу узел, где уходит основное время, сравниваю оценку строк с фактом, смотрю на Seq Scan по большой таблице, Nested Loop на сотнях тысяч строк, сортировку на диске. Типичные причины: не хватает индекса под новый фильтр, функция над колонкой, устаревшая статистика после большой загрузки, большой OFFSET, или вообще N+1 в коде. Чиню, индекс создаю через CONCURRENTLY, и сравниваю план и время до и после. И выясняю, что изменилось: релиз, рост таблицы, раздувание после массовых обновлений.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.