11 / 15
Что такое проблема N+1 запросов и как её обнаружить и убрать?
N+1 — это когда вы одним запросом получили список из N сущностей, а потом на каждую ORM тихо сходил в базу ещё раз. Тысяча заказов превращается в тысячу и один запрос: каждый быстрый, а страница открывается секунды. Причина — ленивая загрузка: обращение к связанному объекту выглядит как чтение атрибута, а на деле это сетевой вызов. Лечится тремя способами: join (хорошо для «многие к одному»), отдельный запрос по списку идентификаторов (WHERE id IN (...) — для «один ко многим», не раздувает результат) и батчинг в слое доступа, когда идентификаторы заранее не собрать. Главное — не искать проблему глазами: поставьте счётчик запросов в тесты. И помните, что N+1 живёт не только в ORM: тот же эффект даёт цикл с вызовами соседнего сервиса.