N+1 - при загрузке N записей для каждой выполняется дополнительный запрос к связанной таблице:
// N+1: 1 запрос на посты + N запросов на авторов
$posts = Post::all(); // SELECT * FROM posts
foreach ($posts as $post) {
echo $post->author->name; // SELECT * FROM users WHERE id = ? (x N раз!)
}
// Решение: eager loading
$posts = Post::with('author')->get();
// SELECT * FROM posts
// SELECT * FROM users WHERE id IN (1, 2, 3, ...) (1 запрос!)
// Другие решения:
// JOIN
// Подзапрос
// DataLoader pattern (batch loading)
// Laravel: withCount(), loadMissing()Инструменты обнаружения: Laravel Debugbar, Clockwork, query log.