Zuallererst, was ich weiß:
Die Indexverwaltung ist nützlich, um die Leistung des Geschäfts zu steigern.
EAV
hat einen Nachteil. Es werden Daten in verschiedenen Tabellen gespeichert, so dass das Abrufen von Daten zeitaufwändig ist.
Damit speichern wir die Daten in einer einzigen Tabelle. Wenn Daten geändert werden, aktualisieren wir diese einzelne Tabelle (nichts als die Aktualisierung der Indizierung).
mysql trigger
: Einige Abfrageaktionen basierend auf einer Tabelle Einfügen / Aktualisieren / Löschen ausführen.
So wird Magento, das den Trigger verwendet, wenn beispielsweise der Preis aktualisiert wird, entity_id
in der Changelog-Tabelle gespeichert .
In devdocs gibt es eine Anweisung zum Implementieren von Triggern, die magento2 verwendet Magento/Framework/Mview
.
Kannst du jemandem den Ablauf dieser Funktionalität erklären?
Ich meine , was ist view
, action
, processor
etc?
Mview
beziehen sich jedoch auf materialisierte Ansichten , wie es die Indextabellen sind.Antworten:
In der offiziellen Dokumentation: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/indexing.html gibt es folgende Informationen:
MView steht für Materialized View und ist eine Momentaufnahme der Datenbank zu einem bestimmten Zeitpunkt. https://en.wikipedia.org/wiki/Materialized_view Warum müssen wir Tabellen duplizieren? Die Ausführung von Indexern ist kostspielig, insbesondere wenn auf Kategorieseiten Zugriffe auftreten, Kunden Bestellungen aufgeben und Administratoren Produkte speichern. Beim Speichern des Produkts wird der Cache ungültig (Off Topic). Bei einem Aktienindexer werden die betroffenen Entitäts-IDs vor Beendigung der Ausführung als zu bereinigende Cache-Tags gesendet (ganzseitiger Cache-Typ). In Magento 2.0-Kategorien werden IDs gekaufter Produkte gesendet. In Magento 2.1 werden die Produkt-IDs gesendet.
Es gibt 2 MySQL-Tabellen, in denen Indexer-Codes und -Status gespeichert sind:
indexer_state
mview_state
mview_state
funktioniert mitUpdate by Schedule
in Admin> System> Indexer-VerwaltungUpdate by Schedule
Lässt die Indexer in Cron laufen.Es gibt 3 Einträge in
Magento_Indexer/etc/contab.xml
:indexer_reindex_all_invalid
läuft weiterindexer_state
. Es gibt immer noch die Notwendigkeit, "normale" Indexer in Cron auszuführenindexer_update_all_views
läuft weitermview_state
indexer_clean_all_changelogs
- löscht Änderungsprotokolle, die von verwendet werdenmview_state
Beachten Sie, dass cron Indexer Gruppenaufgaben in einem separaten PHP - Prozess ausgeführt werden , wie es in deklariert
etc/contab_groups.xml
:<use_separate_process>1</use_separate_process>
.Changelog-Tabellen sind:
[indexer name]_cl
(mit einem Suffix versehen_cl
). zBcataloginventory_stock_cl
. Wenn Sie über Indexer verfügenUpdate by Schedule
, die ein Produkt in admin festlegen und speichern, sehen Sie dasentity_id
Produkt in dieser Tabelle. Es ist ein großer Kreis, ich denke, eine Bestellung aufzugeben oder eine Lieferung zu erstellen, wird auch hier einen Eintrag hinzufügen.Jemand hat in der offiziellen Dokumentation ein Beispiel angegeben, wie neue materialisierte Ansichten erstellt werden und welche Schnittstellenmethoden erforderlich sind.
Dies ist sinnvoll:
//public function execute($ids); Used by mview, allows you to process multiple **entities** in the "Update on schedule" mode }
Wobei der$ids
Parameter die Entitäts-IDs aus*_cl
Tabellen enthält.Was ist die Verbindung zwischen Cache-Invalidierung und Indexer. Kategorieseiten werden jetzt ganzseitig zwischengespeichert (integrierter ganzseitiger Cache oder durch Varnish).
Es gibt
\Magento\Indexer\Model\Processor\InvalidateCache::afterUpdateMview
:Zurück zu
Magento\Indexer\Cron\UpdateMview::execute()
:Magento\Indexer\Model\Processor::updateMview()
:Darin
app/etc/di.xml
ist:Magento\Framework\Mview\ViewInterface
app/etc/di.xml
Darin
Magento\Framework\Mview\View::update()
ist:Wenn Sie im
vendor/
Verzeichnis nachMagento\Framework\Mview\ActionInterface
suchen, finden Sie zum Beispiel Folgendes:In
\Magento\CatalogInventory\Model\Indexer
:In dieser Klasse gibt es:
Und es sieht so aus, als würde es auf die von MView verwendete "Execute" -Methode einer "normalen" Klasse von Indexern zurückgehen.
Informationen zur Cache-Bereinigung nach dem Stock Indexer. Wenn eine Bestellung aufgegeben wird, werden die Mengen mit diesem Beobachter abgezogen:
\Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver
Ein anderer Beobachter löst den Indexer aus (jedoch nicht direkt in Mview / Indexer nach Zeitplan):
\Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver
Wenn in Mview die neuen Mengen abgezogen
SubtractQuoteInventoryObserver
werden, fügt der MySQL-Trigger (für Mview erstellt) eine Zeile eincataloginventory_stock_cl
und markiert damit, dass für diese gekauften Produkt-IDs ein Neuindex (Bestand & Volltext) durchgeführt werden muss. Es gibt viele MySQL-Trigger, die für Mview erstellt wurden. Sehen Sie sie alle mitSHOW TRIGGERS;
.Wenn ein Produkt nach dem Auschecken nicht mehr im Lager ist, werden 2 Zeilen in diese Tabelle eingefügt (Magento speichert 2-mal den Lagerbestand in diesen 2 Beobachtern).
Wenn cron den Aktienindexer im Mview-Modus ausführt, werden die betroffenen Produkt-IDs (in M2.1) oder Kategorien-IDs (in M2.0) als Cache-Tags an den Cache gesendet. Mit Cache meine ich den Ganzseiten-Cache-Typ. Beispiel:
catalog_product_99
oder ein anderes Cache-Tag-Format, abhängig von der Magento-Version. Das gleiche, wenn Mview nicht aktiviert ist.\Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction::_reindexRows
Und Magento_PageCache hat einen Beobachter
\Magento\PageCache\Observer\FlushCacheByTags
, der den gesamten Seiten-Cache-Typ nach Tags bereinigt. Dies geschieht für den eingebauten Ganzseiten-Cache. Lackcode ist in\Magento\CacheInvalidate\Observer\InvalidateVarnishObserver
.Es gibt eine kostenlose Erweiterung, die nach dem Auschecken des Kunden den Cache für noch vorrätige Produkte leugnet:
https://github.com/daniel-ifrim/innovo-cache-improve
Cache-Bereinigung nur für nicht vorrätige Produkte, nachdem die Kaufabwicklung in Magento 2.2.x eingeführt wurde. Sehen
\Magento\CatalogInventory\Model\Indexer\Stock\CacheCleaner
.Ich denke, die Cron-Ausführung für den Indexer in
Admin > Stores > Configuration > Advanced > System > Cron configuration options for group: index
sollte auf viel mehr als 1 Minute eingestellt sein.quelle
Das
mview.xml
wird zusammen mit verwendet,indexer.xml
um Indexer einzurichten.Die
mview.xml
Datei erklärt:Die
indexer.xml
Datei erklärt:Weitere Informationen zur Deklaration des benutzerdefinierten Indexers finden Sie hier: Benutzerdefinierter Indexer in Magento2
Soweit ich verstanden habe, gibt es hier zwei verschiedene Dinge:
Magento_Indexer
ModulMagento\Framework\Mview
der die materialisierte Ansicht für MySQL mithilfe von Triggern emuliert wird.Hier sind einige Informationen aus der offiziellen Dokumentation
Indizierungsarten
In Bezug auf den Workflow handelt es sich hier um eine teilweise Neuindizierung:
quelle
Die Referenz aus dem Magento-Dokument ist bereits hier, daher überspringe ich diesen Teil.
Magento hat materialized view in 2.0 implementiert, das Änderungen für alle Indexer nachverfolgt. Jeder Indexer verfügt über eine
_cl
Tabelle, die abgerufen wird,entity_id
undauto_increment
version_id
über Auslöser, die den Haupttabellen hinzugefügt werden.Wenn der Cron-Job ausgeführt wird, wird der Indexer
version_id
für jede Ansicht von dermview_state
Tabelle zuletzt abgerufen und die nächsten verfügbaren Entitäten in der_cl
Tabelle indexiert .Die Neuindizierung bereitete bis 1.9.xx Kopfzerbrechen und verlangsamte bei großen Katalogen immer das System.
In Magento 2.0 aktualisieren Indexer nur die einzelnen Entitätsinformationen in Indexertabellen, anstatt die gesamten Daten neu zu indizieren. Dies hält den Ball am Laufen, ohne den Server zu verlangsamen.
Hinweis: Materialized View wird in mysql nicht unterstützt, daher wird es in Magento von PHP-Code verwaltet und funktioniert ähnlich wie Materialized View, eine Funktion in DBMS auf Unternehmensebene wie Oracle.
quelle