Ein Magento-Entwickler ersetzte 300 einzelne ProductRepositoryInterface::getById()-Aufrufe durch eine einzige Collection-Abfrage. Die Datenbankabfragen sanken von 300 auf 1, und die Kategorieseite lud spürbar schneller. Der Preis dafür? Einige Produkte verschwanden aus dem Storefront, was Kunden und Shopbesitzer gleichermaßen ratlos zurückließ.

Das N+1-Problem auf einer Magento-Kategorieseite

Die Seite listete 300 Produkte auf. Für jedes einzelne rief der Code zwei benutzerdefinierte Attribute über die getById()-Methode des Repositories ab, was eine Abfrage pro Produkt erzeugte – das klassische N+1-Muster. Der Ersatz dieser einzeln pro Produkt erfolgenden Ladevorgänge durch eine Collection, die alle benötigten Zeilen in einer einzigen Abfrage abruft, reduzierte die Anzahl der Abfragen drastisch. Die Latenz im Frontend verbesserte sich, aber die Produktliste enthielt nun nicht mehr die Artikel, die zuvor angezeigt worden waren.

Warum die Collection nicht vorrätige Artikel ausblendet

Das Magento-Modul CatalogInventory fügt jeder Produkt-Collection, die für das Frontend erstellt wird, automatisch einen „In-Stock“-Filter hinzu. Der Filter wird aktiviert, wenn die Store-Einstellung Display Out of Stock Products deaktiviert ist – eine häufige Wahl für Händler, die nicht verfügbare Artikel nicht anzeigen möchten.

Im Gegensatz dazu wendet das Repository niemals einen Lagerbestand-Filter an. Es prüft lediglich, ob ein Produkt existiert, und gibt es zurück, unabhängig vom Lagerbestand. Als der Code von Repository-Aufrufen auf eine Collection umgestellt wurde, filterte der Lagerbestand-Filter stillschweigend jedes Produkt heraus, dessen Menge Null war. Es wurde kein Fehler protokolliert; die Collection lieferte einfach weniger Zeilen zurück, als der Entwickler erwartet hatte.

Was dies für Händler bedeutet

Ein Storefront, das stillschweigend nicht vorrätige SKUs entfernt, verursacht mehrere Probleme:

  • Frontend-Komponenten erhalten fehlende Einträge, was zu leeren Labels oder falschen Preisen führt.
  • Das Debugging wird schwieriger, da das Symptom – fehlende Produkte – keine Warnungen erzeugt.

Da die meisten automatisierten Tests In-Stock-Fixtures verwenden, bleibt der Fehler oft verborgen, bis die Website mit echtem Lagerbestand läuft.

So behält man die Geschwindigkeit bei, ohne den Lagerbestand zu verbergen

  1. Standard-Lagerbestand-Filter überspringen – Entfernen Sie den Filter explizit aus der Collection, wenn Sie jedes Produkt unabhängig von der Verfügbarkeit benötigen. Magento bietet Methoden an, um das Stock-Plugin pro Abfrage zu deaktivieren oder zu ersetzen.
  2. Das Repository verwenden, wenn Genauigkeit entscheidend ist – Das Repository garantiert, dass jede angeforderte Produkt-ID zurückgegeben wird, selbst wenn das Produkt nicht vorrätig ist. Cachen Sie die Ergebnisse oder laden Sie nur die benötigten IDs, um die zusätzlichen Abfragen zu bändigen.
  3. Ein Resource Model oder direktes SQL verwenden – Fragen Sie die Produkttabelle direkt nach den benötigten Attributen ab. Dies umgeht alle Collection-Plugins und gibt Ihnen die volle Kontrolle darüber, welche Zeilen einbezogen werden.

Geschwindigkeit versus Korrektheit

Den Austausch einer ineffizienten N+1-Schleife durch eine einzige Collection-Abfrage fühlt sich natürlich an; der Rückgang der Latenz ist spürbar. Doch eine schnellere Abfrage, die den falschen Produktsatz zurückgibt, ist ein Defekt und keine Optimierung. Entwickler müssen die reine Geschwindigkeit gegen das Risiko abwägen, einen unvollständigen Katalog anzuzeigen.

Worauf man als Nächstes achten sollte

  • Konfigurationsabweichungen (Configuration drift) – Überprüfen Sie, ob das Flag Display Out of Stock Products mit dem beabsichtigten Verhalten Ihres benutzerdefinierten Collection-Codes übereinstimmt.
  • Nebenwirkungen von Plugins – Andere Module können eigene Filter zu Collections hinzufügen. Überprüfen Sie den Plugin-Stack, wann immer Sie die Abfragestrategien ändern.

Die Lehre ist klar: Ein N+1-Problem durch eine Collection zu beheben, lohnt sich nur, wenn man auch die Standardfilter der Collection prüft. Das Ignorieren des integrierten Lagerbestand-Filters von Magento kann Ihren Katalog stillschweigend beschneiden und so einen Performance-Gewinn in einen Umsatzverlust verwandeln.