N+1-Probleme aufspüren und unnötige Abfragen in Laravel eliminieren
Performance-Optimierung ist oft langweilig.
Es geht nicht immer um Heldengeschichten, bei denen man die Latenz um 80 % senkt. Meistens geht es um Aufräumarbeiten. Man findet Abfragen, von denen man gar nicht wusste, dass sie ausgeführt werden. Und dann löscht man sie.
Wenn deine Laravel-App wächst, hast du wahrscheinlich diese drei Probleme.
1. Versteckte N+1-Abfragen
Man kann nichts reparieren, was man nicht sieht. Nutze ein Tool wie beyondcode/laravel-query-detector in deiner lokalen Umgebung. Es zeigt dir an, wenn du das Loop-and-Lazy-Load-Muster verwendest.
Führe dies nicht in der Produktion aus. Es verursacht Overhead. Registriere es nur, wenn deine App im Local- oder Testing-Modus ist.
2. Verschwendung durch Eager Loading
Oft lösen Leute N+1-Probleme, indem sie with() hinzufügen. Aber das schafft ein neues Problem. Du lädst unter Umständen eine Beziehung per Eager Loading, die deine View gar nicht mehr nutzt.
Wenn ein Redesign eine Spalte aus einer Tabelle entfernt, musst du den entsprechenden with()-Aufruf in deinem Controller entfernen. Du bezahlst für Daten, die du wegwirfst.
Betrachte jedes Eager Loading als einen Anspruch. Wenn du die Daten nicht verwendest, entferne den Anspruch.
3. Erneutes Berechnen derselben Daten
Einige Werte bleiben während des gesamten Requests gleich. Wenn du sie mehrfach berechnest, verschwendest du CPU-Leistung. Nutze Memoization, um dies zu beheben.
Beispiel:
protected ?string $defaultConnection = null;
public function getDefaultConnectionName(): string
{
return $this->defaultConnection ??= $this->resolveDefaultConnection();
}
Der ??=-Operator berechnet den Wert einmal und verwendet ihn für den Rest des Requests wieder.
4. Abfrage-Fallen in Dashboards
Dashboards führen oft für jede einzelne Karte eine separate count()-Abfrage aus. Wenn du sechs Karten hast, führst du sechs Abfragen aus.
Tu stattdessen diese zwei Dinge:
- Gruppiere deine Zählungen. Hole alle Summen für eine Tabelle in einer einzigen Abfrage.
- Nutze einen kurzen Cache. Dashboard-Statistiken müssen nicht auf die Sekunde genau aktuell sein. Cache sie für fünf Minuten.
Ein Besucher trägt die Kosten der Abfrage. Alle anderen erhalten das gecachte Ergebnis.
Letzter Tipp: Regressionen verhindern
Aufräumarbeiten schlagen fehl, wenn Entwickler den schlechten Code später wieder hinzufügen. Nutze Pest, um deine Abfrageanzahl zu prüfen. Setze eine Obergrenze dafür, wie viele Abfragen eine Seite ausführen darf. Wenn ein Entwickler ein N+1 hinzufügt, wird der Test fehlschlagen.
Bei der Optimierung geht es meistens um das Entfernen. Entferne ungenutzte Loads. Entferne neu berechnete Werte. Entferne unnötige Abfragen.
