N+1 — классическая проблема производительности ORM.
// N+1: 1 запрос за постами + N запросов за автором каждого поста:
$posts = Post::all();
foreach ($posts as $post) {
echo $post->author->name; // запрос на каждой итерации!
}
100 постов = 101 запрос к БД.
Решение — Eager Loading:
// Laravel:
$posts = Post::with('author')->get(); // 2 запроса: posts + authors IN (...)
// Doctrine:
$posts = $em->createQuery('SELECT p, a FROM Post p JOIN FETCH p.author a')->getResult();
Как обнаружить
• Laravel Debugbar / Telescope — показывает все запросы
• Логирование медленных запросов в MySQL
• Профилировщик (Blackfire, Xdebug)