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/locks
l' 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 table
o 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 Manual
e impostare processi alternativi per ricostruire l'indice nelle ore non di punta (quando gli amministratori sono assenti). Solo Product Prices
e Stock Status
dovrebbe 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_Index
avvengono 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 _afterSave
o _afterCommit
eseguiamo il reindicizzazione parziale.
Il Mage_Index_Model_Process
processo 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_Event
memorizza 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:
- catalogo / prodotto (SAVE, DELETE, MASS_ACTION)
- catalogo / categoria (SALVA, ELIMINA)
- catalog / resource_eav_attribute (SALVA, ELIMINA)
- cliente / gruppo (SALVA)
- cataloginventory / stock_item (SALVA)
- tag / tag (SALVA)
- core / store (SALVA, ELIMINA)
- core / store_group (SALVA, ELIMINA)
- 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: