Вступить в клуб →
лёгкаявопросPostgreSQL и Redis: запросы и кэш

Список заказов отдаётся секунду из-за запроса в цикле

Ручка списка заказов работает так:

orders, _ := repo.ListOrders(ctx, limit) // 1 запрос, 100 строк

for i := range orders {
    user, _ := repo.GetUser(ctx, orders[i].UserID) // ещё 1 запрос на каждый заказ
    orders[i].UserName = user.Name
}

p95 ручки — 900 мс, в трейсе видно 101 обращение к базе. Как называется проблема и чем её лечат в первую очередь?

  • Нехватка соединений — нужно поднять размер пула и `max_connections`
  • Проблема N+1 — заменить цикл одним запросом с `JOIN` или выборкой пользователей по списку ID
  • Отсутствие транзакции — обернуть цикл в одну транзакцию, и обращения схлопнутся
  • Медленный обход — запускать `GetUser` в горутинах, тогда задержка исчезнет

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела