Kiedy indeksy są unieważniane?

23

Mam sklep i przez cały czas WSZYSTKIE indeksy są nieprawidłowe. Zauważyłem, że nie mam pojęcia, kiedy indeks jest unieważniony.

Czy możesz podać mi listę „wszystkich” zdarzeń, które powodują, że jeden lub więcej z tych indeksów traci ważność?

  • Cechy produktu
  • Ceny produktów
  • Przepisywanie adresów URL katalogu
  • Dane płaskie produktu
  • Produkty kategorii
  • Indeks wyszukiwania w katalogu
  • Tag Agregacja danych
  • Stan magazynowy
Fabian Blechschmidt
źródło

Odpowiedzi:

18

Wykonanie grep w katalogu kodu spowoduje wyświetlenie listy plików, która wyzwala unieważnienie. grep -Ri '::STATUS_REQUIRE_REINDEX' .

Następujące pliki podstawowe powodują unieważnienie

./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

Podstawowe zdarzenia w rdzeniu Magento CE to

Cechy produktu

specyficzny atrybut zapisu (jest częścią produktu płaskiego), sklep, grupa_sklepów, jeśli produkt katalogu płaskiego jest włączony

Ceny produktów

sprawdzanie ustawień konfiguracji zapisz (np. zakres cen). lub zapisz produkt, stwórz / usuń stronę

Przepisywanie adresów URL katalogu

bez konkretnego unieważnienia

Dane płaskie produktu

Specyficzny atrybut zapisu (jest częścią produktu płaskiego), jeśli produkt katalogu płaskiego jest włączony, Po włączeniu produktu płaskiego

Kategoria Dane płaskie

Sprawdź, czy kategoria katalogu płaskiego jest włączona i konkretna kategoria zapisu, po włączeniu kategorii płaskiej

Produkty kategorii

sprawdź, czy kategoria katalogu jest włączona i określona kategoria zapisu

Indeks wyszukiwania w katalogu

określony atrybut zapisu (jest częścią atrybutów, które można przeszukiwać), sklep, grupa_sklepów, jeśli produkt z katalogu płaskiego jest włączony

Tag Agregacja danych

Nigdy nie unieważnione, z wyjątkiem ogólnych warunków wymienionych poniżej

Stan magazynowy

określony System> Ustawienia konfiguracji w zakładce zapasy zapisz, pokaż na przykład produkty z zapasów

Wszystkie są unieważniane po wycofaniu kopii zapasowej System > Tools > Backuporaz tworzeniu, usuwaniu lub przenoszeniu stron internetowych, sklepów i widoków sklepu Po uruchomieniu importu przepływu danych dla produktu, unieważnia się: katalog_produktu_cena, katalog_kategorii_produktu, katalog wyszukiwania_tekstowy, katalog_produktu_produktu

Niektóre indeksatory, takie jak dane płaskie i indeksator adresów URL, wydają się być również unieważniane przez zapisywanie core_config_datawartości.

Sander Mangel
źródło
14

Może warto tymczasowo utworzyć przepisywanie tej witryny

Mage_Index_Model_Resource_Process

Następnie zrób coś takiego:

<?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);
    }

}

Powinno to łatwo wskazać, kiedy indeksator zostanie unieważniony, a ślad wywołania, który był za to odpowiedzialny.

Daniel Sloof
źródło
10

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/locksktó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 tablelub 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 Manuali skonfigurowanie alternatywnych procesów w celu przebudowania indeksu poza godzinami szczytu (gdy administratorów nie ma w domu). Tylko Product Pricesi Stock Statuspowinien 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_Indexerjest indeksatorem, wszystkie interakcje z innymi modułami modułów Mage_Indexodbywają 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 _afterSavelub _afterCommitczęściowe ponowne indeksowanie.

Proces Mage_Index_Model_Processlub 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_Eventprzechowuje 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:

  1. katalog / produkt (ZAPISZ, USUŃ, MASA_AKCJA)
  2. katalog / kategoria (ZAPISZ, USUŃ)
  3. catalog / resource_eav_attribute (SAVE, DELETE)
  4. klient / grupa (ZAPISZ)
  5. cataloginventory / stock_item (SAVE)
  6. tag / tag (ZAPISZ)
  7. core / store (ZAPISZ, USUŃ)
  8. core / store_group (SAVE, DELETE)
  9. 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:

B00MER
źródło
1
merch.docs.magento.com/ee/user_guide/system-operations/… Zobacz „Wydarzenia, które ponownie uruchamiają reindeksowanie”
B00MER