Список заказов отдаётся секунду из-за запроса в цикле
Ручка списка заказов работает так:
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` в горутинах, тогда задержка исчезнет
