Глоссарий

Проблема N+1

Проблема N+1 — антипаттерн, при котором для отображения N записей выполняется N+1 SQL-запрос: один для получения списка и по одному для каждой связанной записи. На 100 записях — 101 запрос; на 1000 — 1001.

Как возникает

ORM загружает список объектов. Затем в цикле для каждого объекта обращается к связанному — и ORM тихо выполняет отдельный SELECT. Каждое обращение выглядит безобидно, но вместе они убивают производительность.

Решение: Eager Loading

Вместо отдельных запросов в цикле — один дополнительный запрос с WHERE id IN (...) для всех связанных записей сразу. Результат: всегда 2 запроса независимо от числа записей. В большинстве ORM это управляется методами типа include, with, joins или preload.

Диагностика

Включите логирование SQL-запросов и обратите внимание, если однотипные SELECT-ы повторяются десятки раз. Количество запросов, пропорциональное числу строк на странице — верный признак N+1.