Quando vengono invalidati gli indici?


23

Ho un negozio e TUTTI gli indici TUTTI non sono validi. Ho notato che non ho idea di quando un indice è invalidato.

Potete darmi un elenco di "tutti" gli eventi, che rendono uno o più di questi indici non validi?

  • Caratteristiche del prodotto
  • Prezzi del prodotto
  • L'URL del catalogo riscrive
  • Dati piatti del prodotto
  • Categoria Prodotti
  • Indice di ricerca del catalogo
  • Tag Aggregation Data
  • Stato delle scorte

Risposte:


18

Fare un grep nella directory del codice ti farà ottenere un elenco di file che innesca un invalidamento. grep -Ri '::STATUS_REQUIRE_REINDEX' .

I seguenti file core attivano un invalidamento

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

Gli eventi di base nel core di Magento CE sono

Caratteristiche del prodotto

attributo di salvataggio specifico (fa parte del prodotto flat), store, store_group se il prodotto del catalogo flat è abilitato

Prezzi del prodotto

verifica del salvataggio delle impostazioni di configurazione (come l'ambito dei prezzi). o salvataggio del prodotto, creazione / eliminazione di siti Web

L'URL del catalogo riscrive

nessuna invalidazione specifica

Dati piatti del prodotto

Attributo di salvataggio specifico (fa parte del prodotto flat), se il prodotto catalogo flat è abilitato, dopo abilitare il prodotto flat

Dati piatti di categoria

Verifica è la categoria del catalogo flat abilitata e specifica la categoria di salvataggio, dopo abilita la categoria flat

Categoria Prodotti

il controllo è la categoria di catalogo flat è abilitata e la categoria di salvataggio specifica

Indice di ricerca del catalogo

attributo di salvataggio specifico (fa parte di attributi ricercabili), store, store_group se il prodotto catalogo flat è abilitato

Tag Aggregation Data

Mai invalidato ad eccezione delle condizioni generali di seguito indicate

Stato delle scorte

Sistema specifico> Impostazioni di configurazione nel salvataggio della scheda inventario, ad esempio prodotti fuori stock disponibili

Tutti vengono invalidati dopo un rollback del backup System > Tools > Backupe dalla creazione, eliminazione o spostamento di siti Web, negozi e visualizzazioni dei negozi Dopo aver eseguito le importazioni del flusso di dati per prodotto, viene invalidato quanto segue: catalog_product_price, catalog_category_product, catalogsearch_fulltext, catalog_product_flat

Numerosi indicizzatori come i dati flat e l'indicizzatore URL sembrano anche essere invalidati salvando i core_config_datavalori.


14

Forse è un'idea per creare temporaneamente una riscrittura per questo sito

Mage_Index_Model_Resource_Process

Quindi fai qualcosa del tipo:

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

}

Ciò dovrebbe individuare facilmente quando un indicizzatore viene invalidato e la traccia della chiamata che ne era responsabile.


10

Dal momento che altri hanno già risposto alle tue domande specifiche. Ho pensato che potrebbe essere meglio spiegare perché è necessario l'indicizzazione e come si collega a Magento e al rapporto con i database moderni .

Indice: un elenco alfabetico di nomi, soggetti, ecc., Con riferimenti ai luoghi in cui si verificano, che si trovano in genere alla fine di un libro.

Quindi cos'è esattamente un indice in termini di database ?

Un indice è una struttura di dati che ordina un numero di record su uno o più campi e accelera il recupero dei dati. Questo per evitare la scansione attraverso i blocchi del disco che attraversa una tabella durante la ricerca nel database.

E quale indicizzazione è in termini di Magento ? Il sottoprodotto di EAV (Entity Attribute Value) AKA un database all'interno di un database. Con più tabelle di ricerca, la raccolta di tutti gli attributi contrassegnati come indicizzati per essere combinati in una tabella piatta di tutte le tabelle di ricerca, per query più veloci e meno I / O e cicli della CPU.

Ricordo una menzione che quando Magento era inizialmente in fase di sviluppo, la flessibilità era in cima alla lista delle priorità, il che è comprensibile perché hanno scelto di andare con il modello di dati EAV. Alla fine, tuttavia, il costo di tale flessibilità ha avuto un costo per le prestazioni e ha afflitto Magento sin dall'inizio.

In generale, gli ingegneri Magento avevano il compito, in primo luogo, di costruire il sistema più flessibile e personalizzabile possibile e preoccuparsi delle prestazioni in seguito. Perché Magento è così lento?

EAV è ottimo per l'archiviazione dei dati ma terribile per le transazioni. Quindi perché abbiamo bisogno di indici per cominciare? Poiché lo stesso approccio del modello relazionale è stato reimplementato, Magento ora deve gestire tutte le cose che MySQL fa da sé internamente. Alcune cose da considerare, come gli indici già esistenti nelle tabelle MySQL. Con questo in mente, considera ora il modello di dati EAV:

  • E ntità = Tabella
  • A ttribute = Field
  • V alue = Value

Lo stesso deve essere reimplementato, che è molto "anti-pattern" IMO.

Inoltre, questo è lo stesso motivo per cui si trova var/locksl' indicizzatore utilizzato per bloccare il processo di indicizzazione. Stesse ragioni per cui i database hanno il blocco di righe / tabelle.

Ora, quando un record, supponiamo che un valore del prodotto sia stato modificato flat tableo index(come ciò che MySQL si riferirebbe ad esso) deve essere aggiornato per riflettere le domande sui dati appena modificati da trovare in modo rapido ed efficiente senza eseguire la scansione di numerosi record. I tavoli piatti esistono così come sono stati usati nello stesso motivo per cui MySQL li possiede, senza un tale indice (come un libro) richiede una scansione completa del tavolo per recuperare il record. Ciò significa enormi quantità di I / O sia per il disco che per la memoria, nonché i cicli della CPU per individuare i dati richiesti, il che è molto negativo per le prestazioni.

Poiché Magento utilizza il modello di dati EAV, ci sono numerose tabelle di ricerca che devono essere scansionate per riunire tutti i dati per individuare i dati richiesti. Questo è ciò che accade se si disabilitano i cataloghi Flat. Proprio come MySQL, la ricerca del record viene eseguita utilizzando un indice (tabella piatta) da utilizzare per individuare rapidamente il record preservando preziosi cicli I / O. Creare una tabella e non aggiungere alcun indice equivale a non usare le tabelle piatte in Magento. Mentre questi due scenari possono funzionare bene in scenari diversi, vedi Ben dell'ottima risposta di Sonassi a questa domanda. (Suggerimento implica la comprensione dell'ambito dei dati.)

Sebbene non sia una risposta diretta alla tua domanda, comprendere le parti mobili ed essere meglio preparati per loro dovrebbe aiutare ad alleviare alcuni dei mal di testa che derivano dall'indicizzazione. " Tratta il problema piuttosto che il sintomo. "

Esplorare di più all'interno dei moderni sistemi di database può aiutare a comprendere meglio come e perché l'indicizzazione è necessaria e come si collega (in qualche modo) anche all'indicizzazione di Magento.

Riassumendo: comprendere gli ambiti del problema prima di applicare ciecamente soluzioni. Poiché non tutti i dati saranno esattamente uguali e le soluzioni di pianificazione e implementazione DOPO avrete una buona / completa comprensione del problema. L'ottimizzazione del database può essere molto gratificante per la gestione delle modifiche. Come prevenire il temuto DEADLOCKS.

Puoi anche considerare di impostare tutti i tuoi indicizzatori Manuale impostare processi alternativi per ricostruire l'indice nelle ore non di punta (quando gli amministratori sono assenti). Solo Product Pricese Stock Statusdovrebbe essere impostato su Update on Save.

Ora considera come funziona l'indicizzazione da un punto di vista tecnico. Il modulo principale è responsabile dell'indicizzazione Mage_Index. Modelli di base del divisore: Indexer, Process, Event.

Mage_Index_Model_Indexerè l'indicizzatore, tutte le interazioni con il modulo di altri moduli Mage_Indexavvengono attraverso questo servizio. Contiene i seguenti metodi:

  • processEntityAction() Crea e registra l'evento e avvia il processo di indicizzazione
  • logEvent() Crea un evento e lo registra per l'indicizzazione successiva;
  • indexEvent() Esegue gli eventi di indicizzazione;
  • getProcessesCollection()Restituisce la raccolta di tutti i processi come Attributi del prodotto, Prezzi del prodotto, Riscrittura URL del catalogo, ecc. Di solito dopo aver modificato l'essenza, come il metodo _afterSaveo _afterCommiteseguiamo il reindicizzazione parziale.

Il Mage_Index_Model_Processprocesso o è l'essenza dell'indicizzatore che memorizza lo stato, l'ultima operazione eseguita. Tutti i processi sono memorizzati nella tabella index_process. Il programma ha un metodo getIndexer()che restituisce l'indice del modello. La maggior parte delle attività delegate dal processo del modello di indice.

Mage_Index_Model_Eventmemorizza informazioni sull'evento che si è verificato. Ad esempio, memorizziamo il prodotto e dopo il salvataggio, creiamo un nuovo evento e memorizziamo informazioni su quale tipo di entità abbiamo appena salvato quale ID ha lo spirito e quale azione abbiamo eseguito per questa sostanza.

Un elenco generale di quando si verifica l'invalidazione:

  1. catalogo / prodotto (SAVE, DELETE, MASS_ACTION)
  2. catalogo / categoria (SALVA, ELIMINA)
  3. catalog / resource_eav_attribute (SALVA, ELIMINA)
  4. cliente / gruppo (SALVA)
  5. cataloginventory / stock_item (SALVA)
  6. tag / tag (SALVA)
  7. core / store (SALVA, ELIMINA)
  8. core / store_group (SALVA, ELIMINA)
  9. core / sito web (SALVA, ELIMINA)

Qualsiasi modello di risorsa con indice registrato nel modulo config.xml, al momento del salvataggio della transazione. afterCommitCallback()viene chiamato con un prefisso. È qui che vengono registrati gli eventi indice, poiché è al termine di una transazione riuscita.

... e mi rattrista che EAV sia ancora in giro in Magento 2. :(

Riferimenti:


1
merch.docs.magento.com/ee/user_guide/system-operations/… Vedi "Eventi che scatenano la reindicizzazione"
B00MER
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.