N+1 Queries in Laravel vermeiden: Datenbankoptimierung
Das N+1 Problem in Laravel
Das N+1 Query Problem ist einer der häufigsten Performance-Killer in Laravel-Anwendungen. Und er ist leicht zu vermeiden.
Was ist das N+1 Problem?
// SCHLECHT: 1 Query für alle Posts + 1 Query pro Post für den Autor
$posts = Post::all();
foreach ($posts as $post) {
echo $post->author->name; // Jedes Mal eine neue Query!
}
Bei 100 Posts: 101 Queries. Bei 1.000 Posts: 1.001 Queries.
Die Lösung: Eager Loading
// GUT: 2 Queries total
$posts = Post::with('author')->get();
foreach ($posts as $post) {
echo $post->author->name; // Kein extra Query
}
Laravel Telescope hilft
Mit Laravel Telescope siehst du alle Queries die ein Request ausführt. Wenn du plötzlich 200 Queries für eine einfache Seite siehst — N+1 ist der Übeltäter.
strictMode() in der Entwicklung
// In AppServiceProvider
Model::preventLazyLoading(! app()->isProduction());
Das wirft eine Exception wenn Lazy Loading in der Entwicklung passiert. Brutale aber effektive Methode um N+1 Probleme zu finden.