- Come funziona l'indicizzazione in Magento
- Cosa fa esattamente?
- Perché è richiesto?
Risposte:
Esistono diversi tipi di indici in Magento.
Tutti gli indicizzatori sono lì per rendere le cose più veloci.
Tratterò qui solo alcuni di essi.
Indice piatto
Ci sono 2 di tali indici. Uno per le categorie e uno per i prodotti.
Per impostazione predefinita, la categoria e le entità del prodotto (e gli indirizzi dei clienti e dei clienti, ma non sono importanti in questa situazione) sono entità EAV . Questo è molto bello per l'estensibilità. Ma è un killer delle prestazioni perché per ottenere tutti i valori per tutti gli attributi sono necessari molti join o più query.
Qui è dove entra in gioco l'indicizzatore piatto.
Trasforma la struttura EAV in una struttura piatta. Voglio dire, crea una tabella (una per ogni punto vendita in Magento) che ha una colonna corrispondente ad un attributo. Questo rende le selezioni più veloci. Per le categorie tutti gli attributi vengono convertiti in colonne di tabella. Per i prodotti solo quelli contrassegnati come "Utilizzati nell'elenco dei prodotti" perché è possibile vendere tutti i tipi di prodotti con attributi diversi e la creazione di una tabella con colonne Gazillion potrebbe non essere possibile.
Inoltre, alcuni prodotti potrebbero essere disabilitati o non appartenere a un determinato sito Web e non è necessario includerli nelle voci per la ricerca. Sono esclusi dall'indicizzatore.
Le tabelle piane generate vengono utilizzate per leggere i dati nella fronend. Il back-end utilizza ancora la struttura EAV.
Ricerca nel catalogo Indice
È possibile cercare prodotti in base a numerosi valori di attributo. Alcuni di essi potrebbero non essere inclusi nelle tabelle flat generate dall'indicizzatore flat. Questo indice riempie una tabella con i valori degli attributi ricercabili per i prodotti, quindi è più facile cercarli in base alle parole chiave. Avere tutte le informazioni in una tabella (o in un campo) consente di utilizzare la ricerca full-text e ottenere risultati pertinenti.
Prezzi del prodotto .
Il prezzo di un prodotto può essere influenzato da molte variabili. Ad esempio, gruppo di clienti, sito Web, regole di sconto del catalogo.
Come sopra, ottenere i prodotti con i loro prezzi significherà molti join o selezioni multiple. Inoltre, i prodotti in bundle hanno uno strano sistema di prezzi. Questo indicizzatore aggrega i dati in alcune tabelle ( catalog_product_index_price_*
) e semplifica notevolmente le selezioni (ordinamento e filtro).
Catalog url Rewrites
Cancella le regole di riscrittura dell'URL impostando quale url corrisponde a quale prodotto o categoria. In questo modo è più semplice per il sistema interno di gestione degli url decidere quale pagina visualizzare quando si chiama un url non standard. Invece di cercare tra tutte le chiavi URL di prodotto e categoria, cerca solo in una tabella.
Prodotti di categoria
In Magento puoi impostare un attributo di categoria chiamato 'Is Anchor' su true o false. Se è vero, significa che la categoria in questione elencherà tutti i prodotti delle categorie secondarie. Ancora una volta, determinando questo tempo reale ci vorranno più risorse rispetto alla sola lettura di un tavolo. Questo indicizzatore crea l'associazione tra prodotti e categorie in base alle associazioni impostate nel back-end e al flag "Is Anchor" sulle categorie.
Stato delle scorte
Per prodotti semplici è facile. Possono essere disponibili o esauriti, ma configurabili, raggruppati e raggruppati non è così semplice. Possono essere disponibili o esauriti a seconda dei prodotti figlio associati al prodotto principale. Ancora una volta (sto solo ripetendo me stesso qui) ottenere il loro stato in tempo reale significherebbe molte domande.
Attributi del prodotto .
Questo raccoglie tutti gli attributi che possono essere utilizzati nella navigazione a più livelli per lo stesso motivo. Avere tutti in un unico posto per una lettura più veloce.
Aggregazione di tag
Non ho idea di cosa faccia. Non ho mai usato i tag in un vero progetto dal vivo.
Non posso prendermi il merito per questo dato che è preso dal post originale all'indirizzo: https://stackoverflow.com/questions/4945307/can-someone-explain-magentos-indexing-feature-in-detail
L'indicizzazione di Magento è simile solo all'indicizzazione a livello di database nello spirito. Come afferma Anton, è un processo di denormalizzazione per consentire un funzionamento più rapido di un sito. Vorrei provare a spiegare alcuni dei pensieri alla base della struttura del database Magento e perché rende necessaria l'indicizzazione per operare a velocità.
In un database MySQL più "tipico", una tabella per la memorizzazione dei prodotti del catalogo sarebbe strutturata in questo modo:
PRODUCT:
product_id INT
sku VARCHAR
name VARCHAR
size VARCHAR
longdesc VARCHAR
shortdesc VARCHAR
... etc ...
Questo è veloce per il recupero, ma lascia un problema fondamentale per un pezzo di software di e-commerce: cosa fai quando vuoi aggiungere più attributi? Che cosa succede se vendi giocattoli e, anziché una colonna di dimensioni, hai bisogno di age_range? Bene, potresti aggiungere un'altra colonna, ma dovrebbe essere chiaro che in un grande negozio (ad esempio Walmart, ad esempio), ciò comporterebbe righe vuote al 90% e tentare di mantenere nuovi attributi è quasi impossibile.
Per combattere questo problema, Magento divide le tabelle in unità più piccole. Non voglio ricreare l'intero sistema EAV in questa risposta, quindi per favore accetta questo modello semplificato:
PRODUCT:
product_id INT
sku VARCHAR
PRODUCT_ATTRIBUTE_VALUES
product_id INT
attribute_id INT
value MISC
PRODUCT_ATTRIBUTES
attribute_id
name
Ora è possibile aggiungere attributi a piacere inserendo nuovi valori in product_attributes e quindi inserendo i record adiacenti in product_attribute_values. Questo è fondamentalmente ciò che fa Magento (con un po 'più di rispetto per i tipi di dati di quelli che ho mostrato qui). In effetti, ora non c'è motivo per cui due prodotti abbiano campi identici, quindi possiamo creare interi tipi di prodotto con diversi set di attributi!
Tuttavia, questa flessibilità ha un costo. Se voglio trovare il colore di una camicia nel mio sistema (un esempio banale), devo trovare:
Magento lavorava in questo modo, ma era molto lento. Quindi, per consentire prestazioni migliori, hanno fatto un compromesso: una volta che il proprietario del negozio ha definito gli attributi desiderati, andare avanti e generare il grande tavolo dall'inizio. Quando qualcosa cambia, annulla lo spazio e generalo di nuovo. In questo modo, i dati vengono archiviati principalmente nel nostro bel formato flessibile, ma interrogati da un'unica tabella.
Queste tabelle di ricerca risultanti sono gli "indici" di Magento. Quando si reindicizza, si sta facendo saltare in aria la vecchia tabella e generandola di nuovo.
Spero che chiarisca un po 'le cose!
nuke it from space
, bello :)
Magento è un sistema piuttosto potente e complesso. Permette di lavorare con enormi quantità di dati, ma quando il database è sovraccarico di tonnellate di record diventa pesante e lento. Magento utilizza gli indici per risolvere questo problema. Gli indici sono tabelle di database aggiuntive con alcuni dati semplici, che consente di organizzare risposte rapide dal database.
Per impostazione predefinita, il sistema principale aggiorna gli indici sul salvataggio di ciascun elemento. Ma in alcuni casi è necessario farlo manualmente, ad esempio alcuni tipi di azioni di massa, ecc. È possibile aggiornare gli indici in qualsiasi momento dal back-end dell'amministratore (Amministratore-> Sistema-> Gestione indice). Ma a volte causa problemi.
Ad esempio, se hai 10k + prodotti e molte categorie, la ricostruzione dell'indice "catalog url rewrite" potrebbe richiedere ore. Quindi lo script php può semplicemente rompersi a causa del superamento di max_execution_time. C'è un modo per risolvere diversi problemi eseguendo il processo reindex dalla riga di comando.