In der offiziellen Dokumentation:
https://devdocs.magento.com/guides/v2.3/extension-dev-guide/indexing.html
gibt es folgende Informationen:
`Allows tracking database changes for a certain entity (product, category and so on) and running change handler.
Emulates the materialized view technology for MySQL using triggers and separate materialization process (provides executing PHP code instead of SQL queries, which allows materializing multiple queries).`
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 mit Update by Schedule
in Admin> System> Indexer-Verwaltung
Update by Schedule
Lässt die Indexer in Cron laufen.
Es gibt 3 Einträge in Magento_Indexer/etc/contab.xml
:
<group id="index">
<job name="indexer_reindex_all_invalid" instance="Magento\Indexer\Cron\ReindexAllInvalid" method="execute">
<schedule>* * * * *</schedule>
</job>
<job name="indexer_update_all_views" instance="Magento\Indexer\Cron\UpdateMview" method="execute">
<schedule>* * * * *</schedule>
</job>
<job name="indexer_clean_all_changelogs" instance="Magento\Indexer\Cron\ClearChangelog" method="execute">
<schedule>0 * * * *</schedule>
</job>
</group>
indexer_reindex_all_invalid
läuft weiter indexer_state
. Es gibt immer noch die Notwendigkeit, "normale" Indexer in Cron auszuführen
indexer_update_all_views
läuft weiter mview_state
indexer_clean_all_changelogs
- löscht Änderungsprotokolle, die von verwendet werden mview_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
). zB cataloginventory_stock_cl
. Wenn Sie über Indexer verfügen Update by Schedule
, die ein Produkt in admin festlegen und speichern, sehen Sie das entity_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.
<?php
<VendorName>\Merchandizing\Model\Indexer;
class Popular implements \Magento\Framework\Indexer\ActionInterface, \Magento\Framework\Mview\ActionInterface
{
public function executeFull(); //Should take into account all placed orders in the system
public function executeList($ids); //Works with a set of placed orders (mass actions and so on)
public function executeRow($id); //Works in runtime for a single order using plugins
public function execute($ids); //Used by mview, allows you to process multiple placed orders in the "Update on schedule" mode
}
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
:
/**
* Update indexer views
*
* @param \Magento\Indexer\Model\Processor $subject
* @return void
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterUpdateMview(\Magento\Indexer\Model\Processor $subject)
{
if ($this->moduleManager->isEnabled('Magento_PageCache')) {
$this->eventManager->dispatch('clean_cache_after_reindex', ['object' => $this->context]);
}
}
Zurück zu Magento\Indexer\Cron\UpdateMview::execute()
:
/**
* Regenerate indexes for all invalid indexers
*
* @return void
*/
public function execute()
{
$this->processor->updateMview();
}
Magento\Indexer\Model\Processor::updateMview()
:
/**
* Update indexer views
*
* @return void
*/
public function updateMview()
{
$this->mviewProcessor->update('indexer');
}
Darin app/etc/di.xml
ist:
<preference for="Magento\Framework\Mview\ProcessorInterface" type="Magento\Framework\Mview\Processor" />
/**
* Materialize all views by group (all views if empty)
*
* @param string $group
* @return void
*/
public function update($group = '')
{
foreach ($this->getViewsByGroup($group) as $view) {
$view->update();
}
}
Magento\Framework\Mview\ViewInterface
/**
* Materialize view by IDs in changelog
*
* @return void
* @throws \Exception
*/
public function update();
app/etc/di.xml
<preference for="Magento\Framework\Mview\ViewInterface" type="Magento\Framework\Mview\View" />
Darin Magento\Framework\Mview\View::update()
ist:
$action = $this->actionFactory->get($this->getActionClass());
$this->getState()->setStatus(View\StateInterface::STATUS_WORKING)->save();
..
$action->execute($ids);
..
Wenn Sie im vendor/
Verzeichnis nach Magento\Framework\Mview\ActionInterface
suchen, finden Sie zum Beispiel Folgendes:
In \Magento\CatalogInventory\Model\Indexer
:
class Stock implements \Magento\Framework\Indexer\ActionInterface, \Magento\Framework\Mview\ActionInterface
In dieser Klasse gibt es:
/**
* Execute materialization on ids entities
*
* @param int[] $ids
*
* @return void
*/
public function execute($ids)
{
$this->_productStockIndexerRows->execute($ids);
}
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
$itemsForReindex = $this->stockManagement->registerProductsSale(
$items,
$quote->getStore()->getWebsiteId()
);
Ein anderer Beobachter löst den Indexer aus (jedoch nicht direkt in Mview / Indexer nach Zeitplan):
\Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver
if ($productIds) {
$this->stockIndexerProcessor->reindexList($productIds);
}
Wenn in Mview die neuen Mengen abgezogen SubtractQuoteInventoryObserver
werden, fügt der MySQL-Trigger (für Mview erstellt) eine Zeile ein cataloginventory_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 mit SHOW 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
...
$this->eventManager->dispatch('clean_cache_by_tags', ['object' => $this->cacheContext]);
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.
Mview
beziehen sich jedoch auf materialisierte Ansichten , wie es die Indextabellen sind.