Wann werden die Indizes ungültig gemacht?

23

Ich habe einen Shop und ALLE Indizes sind immer ungültig. Mir ist aufgefallen, dass ich keine Ahnung habe, wann ein Index ungültig wird.

Können Sie mir eine Liste mit "allen" Ereignissen geben, bei denen einer oder mehrere dieser Indizes ungültig werden?

  • Produkteigenschaften
  • Produktpreise
  • Umschreiben von Katalog-URLs
  • Produkt-Flat-Daten
  • Kategorie Produkte
  • Katalogsuchindex
  • Tag-Aggregationsdaten
  • Lagerbestand
Fabian Blechschmidt
quelle

Antworten:

18

Wenn Sie im Codeverzeichnis ein Grep ausführen, wird eine Liste der Dateien angezeigt, die eine Ungültigerklärung auslösen. grep -Ri '::STATUS_REQUIRE_REINDEX' .

Die folgenden Kerndateien lösen eine Invalidierung aus

./core/Mage/CatalogSearch/Model/Indexer/Fulltext.php
./core/Mage/Catalog/Model/Product/Indexer/Flat.php
./core/Mage/Catalog/Model/Product/Indexer/Price.php
./core/Mage/Catalog/Model/Category/Indexer/Flat.php
./core/Mage/Catalog/Model/Category/Indexer/Product.php
./core/Mage/Catalog/Model/System/Config/Backend/Catalog/Product/Flat.php
./core/Mage/Catalog/Model/System/Config/Backend/Catalog/Category/Flat.php
./core/Mage/Catalog/Model/Indexer/Url.php
./core/Mage/Backup/Helper/Data.php
./core/Mage/CatalogInventory/Model/Indexer/Stock.php
./core/Mage/ImportExport/Model/Import.php

Grundlegende Ereignisse im Magento CE-Kern sind

Produkteigenschaften

Spezifisches Speicherattribut (ist Teil des flachen Produkts), Geschäft, Geschäftsgruppe, wenn das flache Katalogprodukt aktiviert ist

Produktpreise

Überprüfung der Konfigurationseinstellungen speichern (wie Preisumfang). oder Produkt speichern, Website erstellen / löschen

Umschreiben von Katalog-URLs

keine spezifische Invalidierung

Produkt-Flat-Daten

Spezifisches Speicherattribut (ist Teil des flachen Produkts), wenn das flache Katalogprodukt aktiviert ist. Nach dem Aktivieren des flachen Produkts

Kategorie Flat Data

Überprüfen Sie, ob die flache Katalogkategorie aktiviert und die bestimmte Kategorie gespeichert ist. Nach der Aktivierung der flachen Kategorie

Kategorie Produkte

Überprüfung ist flach Katalogkategorie ist aktiviert und bestimmte Kategorie speichern

Katalogsuchindex

Spezifisches Speicherattribut (gehört zu den durchsuchbaren Attributen), Geschäft, Geschäftsgruppe, wenn das flache Katalogprodukt aktiviert ist

Tag-Aggregationsdaten

Nie außer den unten genannten allgemeinen Geschäftsbedingungen ungültig

Lagerbestand

Spezifische System-> Konfigurationseinstellungen auf der Registerkarte Inventar speichern, z. B. nicht vorrätige Produkte anzeigen

Alle von ihnen sind ungültig, nachdem ein Rollback für die Sicherung von System > Tools > Backupund das Erstellen, Löschen oder Verschieben von Websites, Speichern und Speicheransichten ausgeführt wurde. Nach dem Ausführen von Datenflussimporten für das Produkt sind die folgenden Elemente ungültig: catalog_product_price, catalog_category_product, catalogsearch_fulltext, catalog_product_flat

Einige Indexer wie Flat Data und der URL-Indexer scheinen ebenfalls durch das Speichern von core_config_dataWerten ungültig zu werden.

Sander Mangel
quelle
14

Vielleicht ist es eine Idee, vorübergehend eine Umschreibung für diese Site zu erstellen

Mage_Index_Model_Resource_Process

Dann mache etwas wie:

<?php

class YourNamespace_YourModule_Model_Resource_Process
    extends Mage_Index_Model_Resource_Process
{

    public function updateStatus($process, $status)
    {
        if ($status === Mage_Index_Model_Process::STATUS_REQUIRE_REINDEX) {
            Mage::log(sprintf('Indexer %s was invalidated.', $process->getIndexer()->getName()), null, 'invalid_index.log', true);
            foreach (debug_backtrace() as $db) {
                Mage::log(sprintf('%s::%s', $db['class'], $db['function']), null, 'invalid_index.log', true);
            }
        }
        return parent::updateStatus($process, $status);
    }

}

Das sollte leicht herausfinden, wann ein Indexer ungültig wird und welche Aufrufverfolgung dafür verantwortlich war.

Daniel Sloof
quelle
10

Da haben andere schon deine Fragen konkret beantwortet. Ich dachte, es wäre vielleicht besser zu erklären, warum eine Indizierung erforderlich ist und wie sie sich auf Magento und die Beziehung zu modernen Datenbanken bezieht .

Index: Eine alphabetische Liste von Namen, Themen usw. mit Verweisen auf die Orte, an denen sie vorkommen, normalerweise am Ende eines Buches.

Was genau ist ein Index in Bezug auf Datenbanken ?

Ein Index ist eine Datenstruktur, die mehrere Datensätze in einem oder mehreren Feldern sortiert und das Abrufen von Daten beschleunigt. Dies soll verhindern, dass beim Durchsuchen der Datenbank die Plattenblöcke durchsucht werden, die eine Tabelle umfasst.

Und was ist Indizierung in Bezug auf Magento ? Das Nebenprodukt von EAV (Entity Attribute Value) AKA ist eine Datenbank innerhalb einer Datenbank. Sammeln Sie mit mehreren Nachschlagetabellen alle Attribute, die als indiziert gekennzeichnet sind, und kombinieren Sie sie zu einer flachen Tabelle aller Nachschlagetabellen, um schnellere Abfragen und weniger E / A- und CPU-Zyklen zu erzielen.

Ich erinnere mich an die Erwähnung, dass bei der Entwicklung von Magento die Flexibilität auf der Prioritätenliste einen hohen Stellenwert hatte, was verständlich ist, warum sie sich für das EAV-Datenmodell entschieden haben. Letztendlich gingen die Kosten für eine solche Flexibilität jedoch zu Lasten der Leistung und haben Magento von Anfang an geplagt.

Im Allgemeinen hatten die Magento-Ingenieure in erster Linie die Aufgabe, ein möglichst flexibles und anpassbares System zu entwickeln und sich später Gedanken über die Leistung zu machen. Warum ist Magento so langsam?

EAV eignet sich hervorragend für Data Warehousing, ist jedoch für Transaktionen schrecklich. Warum brauchen wir also zunächst Indizes? Da der gleiche Ansatz des relationalen Modells neu implementiert wurde, muss Magento nun alle Dinge erledigen, die MySQL selbst macht. Einige Dinge zu beachten, wie z. B. Indizes, die bereits in MySQL-Tabellen vorhanden sind. Berücksichtigen Sie in diesem Zusammenhang auch das EAV-Datenmodell:

  • E ntität = Tabelle
  • Ein Attribut = Feld
  • V ert = Wert

Das gleiche muss neu implementiert werden, was sehr "anti-pattern" IMO ist.

Dies ist auch derselbe Grund, aus dem Sie feststellen, var/locksdass der Indexer den Indexierungsprozess sperrt . Dieselben Gründe, warum Datenbanken Zeilen- / Tabellensperren haben.

Wenn nun ein Datensatz, beispielsweise ein Produktwert, geändert wurde, muss das flat tableoder index(wie MySQL es bezeichnen würde) aktualisiert werden, damit Abfragen nach den neu geänderten Daten schnell und effizient gefunden werden können, ohne dass zahlreiche Datensätze durchsucht werden müssen. Die flachen Tabellen existieren so, wie sie auch von MySQL verwendet werden. Ohne einen solchen Index (wie ein Buch) ist ein vollständiger Tabellenscan erforderlich, um den Datensatz abzurufen. Dies bedeutet eine enorme Menge an E / A sowohl für die Festplatte als auch für den Arbeitsspeicher sowie für die CPU-Zyklen, um die angeforderten Daten zu lokalisieren, was für die Leistung sehr schlecht ist.

Da Magento das EAV-Datenmodell verwendet, müssen zahlreiche Nachschlagetabellen durchsucht werden, um alle Daten zusammenzufügen und die angeforderten Daten zu finden. Dies passiert, wenn Sie die Flat-Kataloge deaktivieren. Genau wie bei MySQL wird beim Scannen nach Datensätzen ein Index (flache Tabelle) verwendet, um die Datensätze schnell zu finden und wertvolle E / A-Zyklen zu erhalten. Das Erstellen einer Tabelle und das Nicht-Hinzufügen von Indizes entspricht dem Verzicht auf die Verwendung der flachen Tabellen in Magento. Während diese beiden Szenarien in verschiedenen Szenarien gut funktionieren können, gibt See Ben bei Sonassi eine sehr gute Antwort auf diese Frage. (Hinweis, es geht darum, den Umfang der Daten zu verstehen.)

Es ist zwar keine direkte Antwort auf Ihre Frage, aber das Verständnis der sich bewegenden Teile und die bessere Vorbereitung darauf sollten dazu beitragen, einige der mit der Indizierung verbundenen Kopfschmerzen zu lindern. " Behandle das Problem und nicht das Symptom. "

Wenn Sie sich eingehender mit den Interna moderner Datenbanksysteme befassen, können Sie besser verstehen, wie und warum die Indizierung erforderlich ist und in welchem ​​(gewissen) Zusammenhang sie auch mit der Indizierung von Magento steht.

Zusammenfassend: Verstehen Sie den Umfang Ihres Problems, bevor Sie Lösungen blind anwenden. Da nicht alle Daten exakt gleich sind und Lösungen geplant und implementiert werden, NACHDEM Sie das Problem gut / vollständig verstanden haben. Die Datenbankoptimierung kann für das Änderungsmanagement sehr lohnend sein. Zum Beispiel, um das Gefürchtete zu verhindern DEADLOCKS.

Sie können auch in Betracht ziehen, alle Ihre Indexer auf Manualund alternative Prozesse einzurichten, um den Index außerhalb der Spitzenzeiten (wenn Administratoren abwesend sind) neu zu erstellen . Nur Product Pricesund Stock Statussollte auf gesetzt werden Update on Save.

Betrachten Sie nun, wie die Indizierung aus technischer Sicht funktioniert. Das Hauptmodul ist für die Indizierung verantwortlich Mage_Index. Basismodelle der Indexer: Indexer, Process, Event.

Mage_Index_Model_IndexerWenn es sich um den Indexer handelt, werden alle Interaktionen mit anderen Modulen Mage_Indexüber diesen Dienst ausgeführt. Es enthält die folgenden Methoden:

  • processEntityAction() Erstellt und registriert das Ereignis und startet den Indexierungsprozess
  • logEvent() Erstellt ein Ereignis und registriert es für die nachfolgende Indizierung.
  • indexEvent() Führt die Indizierungsereignisse aus.
  • getProcessesCollection()Gibt die Auflistung aller Prozesse zurück, z. B. Produktattribute, Produktpreise, Katalog-URL-Umschreibungen usw. In der Regel nach Änderung des Inhalts, z. B. der Methode, _afterSaveoder nach _afterCommitteilweiser Neuindizierung .

Der Mage_Index_Model_Processoder -Prozess ist die Essenz Ihres Indexers, der den Status, die letzte ausgeführte Operation, speichert. Alle Prozesse werden in der Tabelle gespeichert index_process. Das Programm verfügt über eine Methode, getIndexer()die den Index des Modells zurückgibt. Die meisten Aufgaben werden vom Prozess des Indexmodells delegiert.

Mage_Index_Model_Eventspeichert Informationen über das aufgetretene Ereignis. Zum Beispiel speichern wir das Produkt und erstellen nach dem Speichern ein neues Ereignis und speichern Informationen darüber, welche Art von Entität wir gerade gespeichert haben, welche ID den Geist hat und welche Aktion wir für diesen Stoff durchgeführt haben.

Eine allgemeine Liste, wann eine Ungültigerklärung eintritt:

  1. Katalog / Produkt (SAVE, DELETE, MASS_ACTION)
  2. Katalog / Kategorie (SPEICHERN, LÖSCHEN)
  3. catalog / resource_eav_attribute (SAVE, DELETE)
  4. Kunde / Gruppe (SAVE)
  5. cataloginventory / stock_item (SAVE)
  6. tag / tag (SPEICHERN)
  7. core / store (SPEICHERN, LÖSCHEN)
  8. core / store_group (SAVE, DELETE)
  9. Kern / Website (SAVE, DELETE)

Jedes Ressourcenmodell mit registriertem Index im Modul config.xmlbeim Speichern der Transaktion. afterCommitCallback()wird mit einem Präfix aufgerufen. Hier werden Indexereignisse protokolliert, da dies das Ende einer erfolgreichen Transaktion ist.

... und es macht mich traurig, dass es EAV in Magento 2 noch gibt :(

Verweise:

B00MER
quelle
1
merch.docs.magento.com/ee/user_guide/system-operations/… Siehe "Ereignisse, die eine Neuindizierung auslösen"
B00MER 16.11.15