Глосарій

Проблема 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.