Ponieważ inni już odpowiedzieli na twoje pytania. Pomyślałem, że lepiej wyjaśnić, dlaczego indeksowanie jest potrzebne i jak odnosi się do Magento i relacji do nowoczesnych baz danych .
Indeks: alfabetyczna lista nazwisk, tematów itp. Z odniesieniami do miejsc, w których występują, zwykle na końcu książki.
Czym dokładnie jest Indeks pod względem baz danych ?
Indeks to struktura danych, która sortuje pewną liczbę rekordów w jednym lub większej liczbie pól i przyspiesza wyszukiwanie danych. Ma to na celu uniknięcie skanowania bloków dyskowych, które obejmuje tabela podczas przeszukiwania bazy danych.
A czym jest indeksowanie w kategoriach Magento ? Produktem ubocznym EAV (Entity Attribute Value) AKA jest baza danych w bazie danych. Dzięki wielu tabelom wyszukiwania, gromadzenie wszystkich atrybutów oznaczonych jako indeksowane w celu połączenia w jedną płaską tabelę wszystkich tabel wyszukiwania, w celu szybszego zapytania i mniejszej liczby operacji we / wy oraz cykli procesora.
Przypominam sobie wzmiankę, że kiedy Magento było początkowo rozwijane, elastyczność znajdowała się na liście priorytetów, co jest zrozumiałe, dlaczego zdecydowali się na model danych EAV. Ostatecznie jednak koszt takiej elastyczności kosztował wydajność i od samego początku nękał Magento.
Ogólnie rzecz biorąc, inżynierowie Magento mieli przede wszystkim za zadanie zbudowanie najbardziej elastycznego, możliwego do dostosowania systemu, a później martwić się o wydajność. Dlaczego Magento jest taki wolny?
EAV doskonale nadaje się do hurtowni danych, ale jest straszny dla transakcji. Dlaczego więc na początek potrzebujemy indeksów? Ponieważ to samo podejście modelu relacyjnego zostało ponownie zaimplementowane, Magento musi teraz obsługiwać wszystkie rzeczy, które MySQL robi wewnętrznie. Niektóre rzeczy do rozważenia, takie jak indeksy już istniejące w tabelach MySQL. Mając to na uwadze, rozważ teraz model danych EAV:
- E ntity = Tabela
- Ttribute = pole
- V alue = wartość
To samo trzeba ponownie wdrożyć, co jest bardzo „anty-wzorcowym” IMO.
Z tego samego powodu możesz znaleźć, var/locks
którego indeksatora używa się do zablokowania procesu indeksowania. Z tych samych powodów bazy danych mają blokowanie wierszy / tabel.
Teraz, gdy rekord, powiedzmy, że wartość produktu została zmieniona, flat table
lub index
(jak to określiłby MySQL) musi zostać zaktualizowany w celu odzwierciedlenia zapytań o nowo zmienione dane, które można znaleźć szybko i skutecznie bez skanowania wielu rekordów. Płaskie tabele istnieją, ponieważ zostały użyte z tego samego powodu, dla którego MySQL je ma, bez takiego indeksu (jak książka) wymaga pełnego skanowania tabeli w celu odzyskania rekordu. Oznacza to ogromne ilości operacji we / wy zarówno dla dysku i pamięci, jak również cykli procesora w celu zlokalizowania żądanych danych, co jest bardzo niekorzystne dla wydajności.
Ponieważ Magento korzysta z modelu danych EAV, istnieje wiele tabel wyszukiwania, które należy przeskanować, aby poskładać wszystkie dane razem, aby zlokalizować żądane dane. Tak się stanie, jeśli wyłączysz katalogi Flat. Podobnie jak MySQL, skanowanie rekordu w porównaniu z użyciem indeksu (płaskiej tabeli), który może być wykorzystany do szybkiego zlokalizowania rekordu przy jednoczesnym zachowaniu cennych cykli We / Wy. Tworzenie tabeli i brak dodawania indeksów jest tym samym, co niestosowanie płaskich tabel w Magento. Chociaż te dwa scenariusze mogą dobrze działać w różnych scenariuszach, zobacz Ben w bardzo dobrej odpowiedzi Sonassi na to pytanie. (Wskazówka dotyczy zrozumienia zakresu danych).
Chociaż nie jest to bezpośrednia odpowiedź na twoje pytanie, zrozumienie ruchomych części i lepsze przygotowanie się do nich powinno pomóc złagodzić niektóre bóle głowy związane z indeksowaniem. „ Traktuj problem, a nie objaw ”.
Więcej informacji na temat wewnętrznych elementów współczesnych systemów baz danych może pomóc w lepszym zrozumieniu, w jaki sposób i dlaczego Indeksowanie jest konieczne oraz w jaki sposób (w pewnym stopniu) odnosi się do Indeksowania Magento.
Podsumowując: Zrozum zakresy swojego problemu przed ślepym zastosowaniem rozwiązań. Ponieważ nie każdy fragment danych będzie dokładnie taki sam, a planowanie i wdrażanie rozwiązań PO DOKŁADNYM / pełnym zrozumieniu problemu. Optymalizacja bazy danych może być bardzo satysfakcjonująca dla zarządzania zmianami. Takich jak zapobieganie przerażającym DEADLOCKS
.
Możesz także rozważyć ustawienie wszystkich indeksatorów Manual
i skonfigurowanie alternatywnych procesów w celu przebudowania indeksu poza godzinami szczytu (gdy administratorów nie ma w domu). Tylko Product Prices
i Stock Status
powinien być ustawiony na Update on Save
.
Teraz zastanów się, jak indeksowanie działa z technicznego punktu widzenia. Główny moduł jest odpowiedzialny za indeksowanie Mage_Index
. Podstawowe modele indekser: Indexer
, Process
, Event
.
Mage_Index_Model_Indexer
jest indeksatorem, wszystkie interakcje z innymi modułami modułów Mage_Index
odbywają się za pośrednictwem tej usługi. Zawiera następujące metody:
processEntityAction()
Tworzy i rejestruje zdarzenie oraz rozpoczyna proces indeksowania
logEvent()
Tworzy zdarzenie i rejestruje je w celu późniejszego indeksowania;
indexEvent()
Uruchamia zdarzenia indeksowania;
getProcessesCollection()
Zwraca kolekcję wszystkich procesów, takich jak atrybuty produktu, ceny produktu, przepisanie adresu URL katalogu itp. Zwykle po zmianie esencji, takiej jak metoda _afterSave
lub _afterCommit
częściowe ponowne indeksowanie.
Proces Mage_Index_Model_Process
lub jest esencją Twojego indeksu, który przechowuje status, operację ostatniego uruchomienia. Wszystkie procesy są przechowywane w tabeli index_process
. Program ma metodę, getIndexer()
która zwraca indeks modelu. Większość zadań delegowanych przez proces modelu indeksu.
Mage_Index_Model_Event
przechowuje informacje o zdarzeniu, które miało miejsce. Na przykład przechowujemy produkt, a po zapisaniu tworzymy nowe wydarzenie i przechowujemy informacje o tym, jaki typ jednostki właśnie zapisaliśmy, jaki identyfikator ma ducha i jakie działania wykonaliśmy dla tej substancji.
Ogólna lista przypadków unieważnienia:
- katalog / produkt (ZAPISZ, USUŃ, MASA_AKCJA)
- katalog / kategoria (ZAPISZ, USUŃ)
- catalog / resource_eav_attribute (SAVE, DELETE)
- klient / grupa (ZAPISZ)
- cataloginventory / stock_item (SAVE)
- tag / tag (ZAPISZ)
- core / store (ZAPISZ, USUŃ)
- core / store_group (SAVE, DELETE)
- core / strona internetowa (SAVE, DELETE)
Dowolny model zasobów z zarejestrowanym indeksem w module config.xml
, po zapisaniu transakcji. afterCommitCallback()
jest wywoływany z prefiksem. To tutaj rejestrowane są zdarzenia indeksu, ponieważ jest to koniec udanej transakcji.
... i zasmuca mnie to, że EAV wciąż jest w Magento 2. :(
Referencje: