Po pierwsze co wiem:
Zarządzanie indeksami jest przydatne w celu zwiększenia wydajności sklepu.
EAV
ma jedną wadę. przechowuje dane w różnych tabelach. dlatego pobieranie danych jest czasochłonne.
Abyśmy mogli przechowywać dane w jednej tabeli. po zmianie danych zaktualizujemy tę pojedynczą tabelę (nic oprócz aktualizacji indeksowania)
mysql trigger
: wykonaj niektóre działania zapytania w oparciu o wstawienie / aktualizację / usunięcie tabeli.
Tak więc magento używając wyzwalacza na przykład, gdy cena jest aktualizowana, zapisze się entity_id
w tabeli zmian.
w devdocs znajduje się instrukcja implementacji wyzwalaczy magento2 Magento/Framework/Mview
.
czy możesz wyjaśnić przepływ tej funkcji?
Mam na myśli to, co jest view
, action
, processor
etc?
Mview
odnosi się do zmaterializowanych widoków , którymi są tabele indeksu.Odpowiedzi:
W oficjalnej dokumentacji: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/indexing.html jest opis:
MView oznacza widok zmaterializowany, który jest migawką bazy danych w danym momencie. https://en.wikipedia.org/wiki/Materialized_view Dlaczego mielibyśmy powielać tabele. Uruchomienie indeksatorów jest kosztowne, zwłaszcza gdy na stronach kategorii występuje ruch, klienci składają zamówienia, a administratorzy zapisują produkty. Przy zapisywaniu produktu pamięć podręczna zostaje unieważniona (nie na temat). W przypadku indeksatora zapasów, przed zakończeniem wykonywania, wysyła identyfikatory encji, których dotyczy, jako znaczniki pamięci podręcznej do wyczyszczenia (typ pamięci podręcznej pełnej strony). W kategoriach Magento 2.0 wysyłane są identyfikatory zakupionych produktów. W Magento 2.1 wysyłane są identyfikatory produktów.
Istnieją 2 tabele MySQL, które przechowują kody indeksujące i statusy:
indexer_state
mview_state
mview_state
współpracuje zUpdate by Schedule
Admin> System> Zarządzanie indeksatoremUpdate by Schedule
sprawia, że indeksatory mają być uruchamiane w cronie.Istnieją 3 wpisy w
Magento_Indexer/etc/contab.xml
:indexer_reindex_all_invalid
jest uruchamianyindexer_state
. Nadal istnieje potrzeba uruchamiania „normalnych” indeksatorów w cronieindexer_update_all_views
jest uruchamianymview_state
indexer_clean_all_changelogs
- czyści dzienniki zmian używane przezmview_state
Należy zauważyć, że zadania grupowe cron Indexer uruchamiane w osobnym procesie php, jak oświadczył w
etc/contab_groups.xml
:<use_separate_process>1</use_separate_process>
.Tabele zmian są:
[indexer name]_cl
(z przyrostkiem_cl
). npcataloginventory_stock_cl
. Jeśli masz indeksatory ustawioneUpdate by Schedule
i zapisujące produkt w adminie, zobaczyszentity_id
ten produkt w tej tabeli. To duże koło, myślę, że złożenie zamówienia lub utworzenie przesyłki doda tutaj również wpis.Ktoś podał przykład w oficjalnym devdoc, jak tworzyć nowe zmaterializowane widoki i jakie są wymagane metody interfejsu (zignoruj powyższe stwierdzenie o rozkazach w poniższym fragmencie):
Ma to sens:
//public function execute($ids); Used by mview, allows you to process multiple **entities** in the "Update on schedule" mode }
gdzie$ids
parametr ma identyfikatory encji z*_cl
tabel.Jaki jest związek między unieważnieniem pamięci podręcznej a indeksatorami. Strony kategorii są teraz buforowane na całej stronie (wbudowana pamięć podręczna na pełną stronę lub przez Varnish).
Jest
\Magento\Indexer\Model\Processor\InvalidateCache::afterUpdateMview
:Powrót do
Magento\Indexer\Cron\UpdateMview::execute()
:Magento\Indexer\Model\Processor::updateMview()
:W
app/etc/di.xml
hotelu znajduje się:Magento\Framework\Mview\ViewInterface
app/etc/di.xml
W
Magento\Framework\Mview\View::update()
hotelu znajduje się:Jeśli szukasz w
vendor/
kataloguMagento\Framework\Mview\ActionInterface
, znajdziesz na przykład:W
\Magento\CatalogInventory\Model\Indexer
:W tej klasie jest:
I wygląda na to, że wraca do „normalnej” klasy indeksującej metody „wykonaj”, która jest używana przez MView.
O czyszczeniu pamięci podręcznej po indeksatorze giełdowym. Kiedy zamówienie jest składane przy kasie, ilości są odejmowane za pomocą tego obserwatora:
\Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver
Ponadto inny obserwator wyzwala indeksatora (ale nie bezpośrednio w Mview / Indexer według harmonogramu):
\Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver
W przypadku Mview, gdy odejmowane są nowe ilości
SubtractQuoteInventoryObserver
, wyzwalacz MySQL (stworzony dla Mview) wstawi wierszcataloginventory_stock_cl
, oznaczając, że należy dokonać reindeksu (zapas i pełny tekst) dla identyfikatorów zakupionych produktów. Istnieje wiele wyzwalaczy MySQL utworzonych dla Mview. Zobacz je wszystkie zSHOW TRIGGERS;
.Kiedy produkt zostanie wyczerpany z magazynu po przejściu do kasy, zobaczysz 2 wiersze wstawione do tej tabeli (Magento zapisuje 2 razy pozycję w magazynie w tych 2 obserwatorach).
Gdy cron uruchamia indeksatora giełdowego w trybie Mview, identyfikatory produktu, którego dotyczy problem (w M2.1) lub identyfikatory kategorii (w M2.0), są wysyłane do bufora czystego jako znaczniki bufora. Przez pamięć podręczną rozumiem typ pamięci podręcznej pełnej strony. Przykład:
catalog_product_99
lub inny format tagu pamięci podręcznej w zależności od wersji Magento. To samo, gdy Mview nie jest włączony.\Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction::_reindexRows
A Magento_PageCache ma obserwatora
\Magento\PageCache\Observer\FlushCacheByTags
, który wyczyści pełny typ pamięci podręcznej stron według tagów. Robi to dla wbudowanej pamięci podręcznej pełnej strony. Kod związany z lakierem jest w\Magento\CacheInvalidate\Observer\InvalidateVarnishObserver
.Istnieje bezpłatne rozszerzenie, które odmówi czyszczenia pamięci podręcznej dla wciąż dostępnych produktów po kasie:
https://github.com/daniel-ifrim/innovo-cache-improve
Czyszczenie pamięci podręcznej tylko w produktach niedostępnych po wprowadzeniu kasy w domyślnym Magento 2.2.x. Zobaczyć
\Magento\CatalogInventory\Model\Indexer\Stock\CacheCleaner
.Uważam, że wykonanie crona dla indeksu
Admin > Stores > Configuration > Advanced > System > Cron configuration options for group: index
powinno być ustawione na znacznie więcej niż 1 minutę.źródło
mview.xml
Jest używany wraz zindexer.xml
do indeksujących konfiguracji.mview.xml
Plik deklaruje:indexer.xml
Plik deklaruje:Więcej informacji na temat deklaracji indeksatora niestandardowego można znaleźć tutaj: Indeksator niestandardowy na Magento2
Z tego, co zrozumiałem, są tutaj dwie różne rzeczy:
Magento_Indexer
modułuMagento\Framework\Mview
którego emuluje zmaterializowany widok MySQL przy użyciu wyzwalaczy.Oto niektóre przelotne informacje z oficjalnej dokumentacji
Rodzaje indeksowania
Jeśli chodzi o przepływ pracy, tutaj chodzi o częściowe ponowne indeksowanie:
źródło
Referencje z dokumentu Magento już tu są, więc pomijam tę część.
Magento zaimplementowało zmaterializowany widok w 2.0, który śledzi zmiany dla wszystkich indeksatorów. Każdy indeksator ma
_cl
tabelę, która pobieraentity_id
iauto_increment
version_id
dodane z wyzwalaczy w tabelach głównych.Po wykonaniu zadania cron indeksator pobiera ostatni
version_id
dla każdego widoku zmview_state
tabeli i indeksuje kolejne dostępne elementy w_cl
tabeli.Reindexing sprawiał ból głowy do 1.9.xx i przy dużym katalogu zawsze spowalniał system.
W programie Magento 2.0 indeksator aktualizuje tylko informacje o konkretnej jednostce w tabelach indeksatora zamiast reindeksować całe dane. Dzięki temu piłka toczy się bez spowolnienia serwera.
Uwaga: Widok zmaterializowany nie jest obsługiwany w mysql, więc w Magento jest zarządzany przez kod PHP i działa podobnie do widoku zmaterializowanego, który jest cechą DBMS na poziomie przedsiębiorstwa, jak Oracle.
źródło