Mview, Changelogs und gezielte Neuindizierung statt Full Reindex
Bei einem Katalog mit hunderttausenden Produkten kostet ein vollstaendiger Reindex Zeit, die viele Shops sich schlicht nicht leisten koennen. Wer Partial Reindex Strategien konsequent nutzt, verarbeitet nur die tatsaechlich geaenderten Datensaetze und haelt die Indexer selbst bei grossem Katalogwachstum in einem beherrschbaren Zeitrahmen.
Inhaltsverzeichnis
- 1. Warum Full Reindex bei grossen Katalogen an Grenzen stoesst
- 2. Mview als technisches Fundament fuer Partial Reindex
- 3. Changelog Tabellen im Detail verstehen
- 4. Partial Reindex im eigenen Indexer implementieren
- 5. Batching: grosse ID Listen sinnvoll aufteilen
- 6. Gezielter Reindex ueber CLI Parameter
- 7. Typische Fallstricke bei ausbleibendem Partial Reindex
- 8. Monitoring von Changelog Groesse und Verarbeitungsstand
- 9. Partial Reindex im Vergleich zu Full Reindex
- 10. Zusammenfassung
- 11. FAQ
1. Warum Full Reindex bei grossen Katalogen an Grenzen stoesst
Ein vollstaendiger Reindex verarbeitet ausnahmslos jeden Datensatz neu, unabhaengig davon, ob er sich seit dem letzten Lauf geaendert hat oder nicht. Bei einem Katalog mit wenigen hundert Produkten faellt das kaum ins Gewicht, bei mehreren hunderttausend Produkten kann ein einzelner Full Reindex Lauf jedoch Stunden dauern. Genau hier setzen Partial Reindex Strategien an: statt alles neu zu berechnen, wird nur die Teilmenge verarbeitet, die sich tatsaechlich geaendert hat.
Der Effekt von Partial Reindex Strategien ist besonders deutlich bei Katalogen, in denen taeglich nur ein kleiner Prozentsatz der Produkte aktualisiert wird, etwa durch Preisaenderungen einzelner Lieferanten oder punktuelle Lagerbestandskorrekturen. Ein Full Reindex wuerde in diesem Szenario die uebrigen 95 Prozent unveraenderter Produkte unnoetig neu berechnen und damit Serverressourcen verschwenden, die anderswo dringender gebraucht werden.
Magento hat Partial Reindex Strategien nicht als nachtraeglichen Performance Hack eingebaut, sondern als integralen Bestandteil der Indexer Architektur ueber den Mview Mechanismus. Wer diesen Mechanismus versteht und korrekt konfiguriert, bekommt Partial Reindex quasi kostenlos, ohne zusaetzliche eigene Infrastruktur aufbauen zu muessen.
2. Mview als technisches Fundament fuer Partial Reindex
Mview, kurz fuer Materialized View, ist der Kernmechanismus hinter jeder Partial Reindex Strategie in Magento. Fuer jeden Indexer, der in mview.xml registriert ist, legt Magento eine Changelog Tabelle an und haengt Datenbank Trigger an die dort deklarierten Quelltabellen. Jede relevante Aenderung, ob Insert, Update oder Delete, schreibt die betroffene Entity ID in diese Changelog Tabelle, versehen mit einer fortlaufenden Versionsnummer.
Der Reindex Prozess liest diese Changelog Tabelle ab der zuletzt verarbeiteten Versionsnummer, sammelt alle seither hinzugekommenen IDs, dedupliziert sie und ruft mit dieser kompakten Liste executeList auf. Fuer solide Partial Reindex Strategien ist entscheidend, dass wirklich alle relevanten Quelltabellen im mview.xml erfasst sind, denn jede fehlende Tabelle bedeutet blinde Flecken, in denen Aenderungen unbemerkt bleiben.
3. Changelog Tabellen im Detail verstehen
Die Changelog Tabelle eines Indexers folgt der Namenskonvention {view_id}_cl und enthaelt im Wesentlichen zwei Spalten: eine automatisch inkrementierte version_id und die betroffene Entity ID. Fuer jede Aenderung an einer beobachteten Quelltabelle entsteht ein neuer Eintrag, auch wenn dieselbe Entity ID innerhalb kurzer Zeit mehrfach geaendert wird. Der Verarbeitungsprozess dedupliziert diese IDs vor dem Aufruf von executeList, sodass ein Produkt, das dreimal hintereinander gespeichert wurde, trotzdem nur einmal neu berechnet wird.
-- Inspect the changelog table for a custom indexer directly
SELECT version_id, entity_id
FROM vendor_pricematrix_cl
ORDER BY version_id DESC
LIMIT 50;
-- Count pending changes since a given version marker
SELECT COUNT(DISTINCT entity_id) AS pending_ids
FROM vendor_pricematrix_cl
WHERE version_id > 128340;
-- Check the current version marker Magento has already processed
SELECT * FROM mview_state WHERE view_id = 'vendor_pricematrix';
Nach erfolgreicher Verarbeitung werden Changelog Eintraege nicht sofort geloescht, sondern folgen einer eigenen Aufraeumroutine, die periodisch alte Eintraege entfernt. Fuer Partial Reindex Strategien ist es wichtig zu wissen, dass die Tabelle mview_state den zuletzt verarbeiteten Versionsstand pro View speichert, das ist die zentrale Stelle, um zu pruefen, ob ein Indexer tatsaechlich auf dem aktuellen Stand ist.
4. Partial Reindex im eigenen Indexer implementieren
Fuer eigene Indexer bedeutet eine funktionierende Partial Reindex Strategie, dass executeList tatsaechlich effizient nur die uebergebenen IDs verarbeitet, statt intern trotzdem alle Datensaetze zu durchlaufen. Ein haeufiger Implementierungsfehler ist, executeList zwar korrekt zu deklarieren, intern aber eine Query ohne WHERE entity_id IN (...) Filterung auszufuehren, wodurch der vermeintliche Partial Reindex faktisch zu einem Full Reindex wird, nur unter falschem Namen.
<?php
declare(strict_types=1);
namespace Vendor\PriceMatrix\Model\ResourceModel\PriceMatrix;
use Magento\Framework\App\ResourceConnection;
/**
* Performs the actual price calculation for a bounded set of product IDs,
* always filtering by entity_id to keep partial reindex genuinely partial.
*/
class PriceCalculator
{
private const TARGET_TABLE = 'vendor_pricematrix';
/**
* @param ResourceConnection $resourceConnection Provides the write connection.
*/
public function __construct(
private readonly ResourceConnection $resourceConnection
) {
}
/**
* Recalculates prices only for the given product IDs, never for the full catalog.
*
* @param int[] $ids Product IDs affected by the change.
* @return void
*/
public function rebuildForIds(array $ids): void
{
if ($ids === []) {
return;
}
$connection = $this->resourceConnection->getConnection();
$table = $this->resourceConnection->getTableName(self::TARGET_TABLE);
// Delete only the affected rows, then recompute exactly those
$connection->delete($table, ['product_id IN (?)' => $ids]);
$select = $connection->select()
->from(['p' => $this->resourceConnection->getTableName('catalog_product_entity')])
->where('p.entity_id IN (?)', $ids);
// ... aggregate and insert freshly computed rows for exactly these IDs
}
}
Diese Partial Reindex Strategie funktioniert nur, wenn jede Schicht der Verarbeitung, von der Action Klasse bis zur Datenbankabfrage, konsequent mit der uebergebenen ID Liste arbeitet und nirgendwo versehentlich auf den gesamten Datenbestand zurueckfaellt.
5. Batching: grosse ID Listen sinnvoll aufteilen
Bei einem Massenimport oder einer grossen Preisaktualisierung koennen mehrere zehntausend IDs gleichzeitig in der Changelog Tabelle landen. Eine Partial Reindex Strategie, die versucht, all diese IDs in einer einzigen Datenbankabfrage mit riesigem IN (...) Klausel zu verarbeiten, riskiert Timeouts oder exzessiven Speicherverbrauch. Der etablierte Ansatz ist Batching: die ID Liste wird in handhabbare Bloecke von einigen hundert bis wenigen tausend IDs aufgeteilt, die nacheinander verarbeitet werden.
Batching bei Partial Reindex Strategien reduziert nicht nur das Risiko von Timeouts, sondern erlaubt auch, den Fortschritt zwischenzuspeichern. Bricht die Verarbeitung nach der Haelfte der Batches ab, etwa durch einen Fehler oder einen Serverneustart, kann der naechste Lauf am letzten erfolgreich verarbeiteten Batch fortsetzen, statt von vorne zu beginnen, sofern der Fortschritt entsprechend protokolliert wird.
6. Gezielter Reindex ueber CLI Parameter
Neben dem automatischen Mview basierten Partial Reindex bietet die Magento CLI auch die Moeglichkeit, gezielt einzelne Datensaetze manuell neu zu indizieren, etwa nach einem Datenimport ohne Trigger Beteiligung oder zu Debugging Zwecken. Diese manuelle Variante ist ebenfalls Teil pragmatischer Partial Reindex Strategien, insbesondere in Migrationsprojekten, in denen Daten direkt per SQL importiert werden und die Trigger deshalb nicht ausgeloest wurden.
# Trigger partial reindex for specific product IDs manually
bin/magento indexer:reindex catalog_product_price --id 101,102,103
# Reindex only rows changed since a specific point via direct row processing
bin/magento indexer:reindex catalogsearch_fulltext --id 555
# Check current mview state for all registered views
bin/mysql -e "SELECT view_id, version_id, mode FROM mview_state;"
# Force Magento to re-detect changelog entries after a manual bulk import
bin/magento indexer:reset vendor_pricematrix
bin/magento indexer:reindex vendor_pricematrix
7. Typische Fallstricke bei ausbleibendem Partial Reindex
Der haeufigste Fehler, der eine Partial Reindex Strategie unbemerkt aushebelt, ist ein Massenimport per direktem SQL Insert oder Update, der die Datenbank Trigger von Mview umgeht. Da Trigger auf konkrete SQL Operationen reagieren, nicht auf das fachliche Ereignis "Daten haben sich geaendert", bleibt die Changelog Tabelle in diesem Fall leer, obwohl sich die Daten sehr wohl geaendert haben. Der Indexer meldet weiterhin Status "valid", obwohl er faktisch veraltet ist.
Ein zweiter haeufiger Fallstrick ist eine unvollstaendige subscriptions Deklaration in mview.xml, bei der eine relevante Quelltabelle schlicht vergessen wurde. Aenderungen an dieser Tabelle bleiben dann fuer die Partial Reindex Strategie vollstaendig unsichtbar. Regelmaessige Stichproben, bei denen ein manueller Full Reindex mit dem aktuellen inkrementellen Stand verglichen wird, decken solche Luecken zuverlaessig auf, bevor sie zu ernsthaften Datenproblemen fuehren.
8. Monitoring von Changelog Groesse und Verarbeitungsstand
Fuer nachhaltige Partial Reindex Strategien lohnt sich ein Monitoring, das die Groesse der Changelog Tabellen ueber die Zeit beobachtet. Waechst eine Changelog Tabelle kontinuierlich, ohne dass die Anzahl der Eintraege durch regelmaessige Verarbeitung sinkt, deutet das auf einen haengenden oder deaktivierten Cron Job hin, der die zugehoerige Mview View nicht mehr verarbeitet.
Ein einfacher Schwellenwert Alarm, der bei einer Changelog Tabelle mit mehr als einigen zehntausend unverarbeiteten Eintraegen ausloest, faengt die meisten praktischen Probleme fruehzeitig ab, bevor der naechste Full Reindex ueberraschend lange dauert oder Frontend Daten sichtbar veralten.
9. Partial Reindex im Vergleich zu Full Reindex
Beide Ansaetze haben ihre Berechtigung, je nach Situation und Datenvolumen.
| Kriterium | Partial Reindex | Full Reindex |
|---|---|---|
| Laufzeit bei grossem Katalog | Kurz, proportional zu Aenderungen | Lang, proportional zur Gesamtgroesse |
| Eignung nach Massenimport ohne Trigger | Ungeeignet, Changelog bleibt leer | Zuverlaessig, verarbeitet alles |
| Ressourcenverbrauch | Niedrig bei wenigen Aenderungen | Hoch, unabhaengig von Aenderungsmenge |
| Reparatur nach Dateninkonsistenz | Findet unentdeckte Luecken nicht | Stellt garantiert konsistenten Stand her |
Die pragmatischste Kombination ist, Partial Reindex Strategien fuer den taeglichen Betrieb zu nutzen und einen periodischen, etwa woechentlichen, Full Reindex als Sicherheitsnetz einzuplanen. Dieser Full Reindex faengt genau die Faelle ab, in denen Trigger umgangen wurden oder eine Mview Subscription unvollstaendig war, und stellt so sicher, dass sich unentdeckte Luecken nicht ueber Wochen hinweg akkumulieren.
Mironsoft
Magento 2 Indexer Performance und Skalierung
Dauert euer Reindex laenger, als euer Katalog wachsen sollte?
Wir analysieren bestehende Indexer, identifizieren versteckte Full Reindex Faelle in vermeintlichem Partial Reindex und richten Monitoring fuer Changelog Tabellen ein, damit euer Shop auch bei starkem Katalogwachstum performant bleibt.
Performance Audit
Reindex Laufzeiten messen und Engpaesse identifizieren
Mview Korrektur
Fehlende Subscriptions und ineffiziente executeList Implementierungen beheben
Monitoring Setup
Changelog Groesse und Verarbeitungsstand dauerhaft im Blick behalten
10. Zusammenfassung
Effektive Partial Reindex Strategien in Magento 2 basieren auf einer korrekt konfigurierten Mview Subscription, einer Action Klasse, die executeList tatsaechlich effizient nur ueber die uebergebenen IDs verarbeitet, und einem Batching Mechanismus fuer grosse ID Mengen. Wo Trigger nicht greifen, etwa bei direktem SQL Massenimport, bleibt ein periodischer Full Reindex als Sicherheitsnetz unverzichtbar.
Der groesste Hebel liegt darin, jede Schicht der Implementierung konsequent auf die uebergebene ID Liste zu beschraenken, statt intern doch wieder ueber den gesamten Datenbestand zu iterieren. Wer Partial Reindex Strategien konsequent umsetzt und regelmaessig gegen unentdeckte Luecken prueft, haelt Reindex Laufzeiten auch bei starkem Katalogwachstum in einem planbaren Rahmen.
Partial Reindex Strategien in Magento 2, das Wichtigste auf einen Blick
Mview Basis
Changelog Tabellen und Trigger erfassen Aenderungen ereignisbasiert, alle relevanten Tabellen muessen erfasst sein.
Effiziente Implementierung
executeList muss konsequent nach ID filtern, sonst wird Partial Reindex zu Full Reindex mit falschem Namen.
Batching
Grosse ID Listen in handhabbare Bloecke aufteilen, um Timeouts und Speicherprobleme zu vermeiden.
Sicherheitsnetz
Periodischer Full Reindex faengt Luecken durch umgangene Trigger oder unvollstaendige Subscriptions ab.