advanced

N+1 queries

Находите repeated per-row relationship queries и исправляйте через joins, batching, preloading или dataloader-style access.

N+1 возникает, когда один запрос загружает N родительских строк, и для каждой уходит ещё один запрос за связанными данными. Латентность и нагрузка на БД растут линейно с размером результата.

					1 запрос: SELECT * FROM orders LIMIT 100
100 запросов: SELECT * FROM customers WHERE id = ?
→ 101 round trip
				

Исправления: join, preload через `IN (...)`, dataloader, batch loader, узкие проекции или изменение формы ответа без лишних связей.

На интервью: назовите обнаружение через SQL-логи или APM и объясните, почему один гигантский join не всегда решение — он дублирует строки и ломает пагинацию.

Типовые ошибки: «лечение» N+1 декартовым join; игнор корректности пагинации; вера, что типизированный ORM не даёт N+1.

Компромисс — сложность batching против предсказуемого числа запросов.

Чеклист:

  • Ищите циклы в SQL-логах.
  • Батчите или preload связи.
  • Сохраняйте корректность пагинации.
  • Подбирайте fix под кардинальность и ответ.