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 под кардинальность и ответ.