Magento2 e l' EAV: Come funziona e perchè non dovresti utilizzarlo

7 Ottobre 2021

Chiunque abbia avuto a che fare con Magento sa che siamo di fronte ad un CMS estremamente versatile e funzionale con una struttura altamente complessa ed articolata, soprattutto nelle sue logiche ed interazioni con i dati.
Proprio per permettere la gestione di una mole di dati sempre più complessa e fitta Adobe ha deciso integrare in Magento 2 un modello EAV proprietario per la gestione ed indicizzazione dei dati.

Cos'è l' EAV di Magento2?

EAV  (Entity-attribute-value) è un modello strutturato flessibile per l'ordinamento ed indicizzaazione dei valori di attributi basati su alcune tipologie di Storage. Nel caso specifico di Magento2, per Data storage si intendono tutti quei database compatibili con Magento2 ( MariaDB, MySQL,NDB Cluster, etc. ), e tale modello è applicato per la gestione flessibile dei dati e le sue entità (Prodotti, categorie, Clienti... )

Al di là del significato letterale dell' EAV, in questo articolo andremo a vedere con la lente di ingrandimento cos'è l'EAV (Nel caso specifico di Magento2), come funziona, quando può essere efficace e quando non.
Ma soprattutto... Ha senso tenere attivo l'EAV su Magento2?

Come funziona l'EAV di Magento2 e come interagisce con il Database

L'EAV come abbiamo detto è un modello struttturato di dati, nel caso specifico di Magento2 incldue principalmente 3 entità:

  • L'attributo (attribute)
  • Valore (Value )
  • Entità (Entity - l'oggetto a cui vuoi applicare l'attributo o set di attributi)

Nel modello EAV i valori degli attributi sono memorizzati in tabelle separate, dove per ogni singolo attributo avremo una riga corrispondente. Principalmente avremo 3 tipologie di tabelle, per il modello EAV di Magento:

  • eav_entity – (E) - Tabella delle entità
  • eav_entity_attribute (A) - Tabella degli attributi
  • eav_entity_{type} (V) - Tabella dei "valori" dei vari campi

Questa tipologia di schema in Magento2 permette di trattare in modo "flessibile" come ad esempio i dati dei clienti (customer), indirizzi clienti(customer_address) , categorie dei cataloghi(catalog_category) e proditti dei cataloghi (catalog_product).

Per comprendere bene, come Magento2 tratta questi campi ed i dati contenuti dobbiamo analizzare in dettaglio la sua logica ed il flusso di inserimento dei dati o lettura, ad esempio per gli attributi per un prodotto.
Ecco quindi un diagramma:

Da come possiamo vedere nello schema sopra, Magento2 ottiene tutti i dati inerenti ai valori degli attributi con una grande query SQL, che viene generata con questa logica:

  1. Ottenere tutte le tabelle inerenti agli attributi di un determinato "entity_type".
  2. Per ognuna delle tabelle, effettua queste operazioni:
    1. Effettua una select subquery della tabellam con tutti i valori e ed id attributo
    2. Applica una condizione all' entity_id ( entity_id = ID dell'entità richiesta )
    3. Applica una condizione dove verifica che store_id sia presente nei valori "catturati" dalla query
    4. Ordina tutti i dati per store_id in ordine decrescente
  3. Unisce tutti i dati appena preparati dalle subquery

Nel momento in cui Magento effettua queste "grandi query" il tuo Databse viene sottoposto ad un notevole sforzo in lettura; di fatto le varie Join che vengono effettuate per recuperare i dati richiesti sono molto esose in termini di risorse e richiedono molte scansioni delle tabelle, così gli I/O del disco vengono messi a dura prova, come le connessioni al DB.
Il primo problema che riscontriamo è che il database tende a rallentarsi enormemente, soprattutto durante i reindex o le attività EAV intensive portando spesso al temuto "Metadata Lock" o ancor peggio "Gateway timeout" e di conseguenza sito web offline.
L'errore che, haimè, spesso molti fanno quando si ha questa problematica durante i reindex è di andare a lavorare male sul my.cnf del Database, aumentando un po' a caso(erroneamente ) tutti i valori, ed in particolare il Join Buffer e Sort Buffer del Mysql non sapendo che tali valori durante il reindex con EAV attivi potrebbero portare all'instabilità del Database e l'aumento esponenziale della Ram ed utilizzo della memoria di Swap per il reindex. (ricordiamo che tali valori vanno ad impattare su ogni connessione, allocando memoria per ogni singola connessione )

E per chi invece, non configura, o peggio ancora lascia "vuoto" il my.cnf con i valori di default forniti dal proprio Provider o pannello di gestione, si troverà in una situazione in alcuni casi peggiore dove il database è costretto a lavorare senza sfruttare al meglio le risorse a disposizione lavorando molto di più e più lentamente del previsto ed utilizzando molto di più il disco.

Il Secondo problema che si riscontra, anche se non direttamente visibile, è che queste enormi query tendono ad invalidare molto frequentemente il query_cache del database rendendo di fatto, la cache delle query praticamente inutile e portando il database ad un utilizzo della CPU maggiore. Questo si traduce in uno sforzo maggiore.
Se per Magento1 era un "must" andare a lavorare sul query_cache, per la verità ( non è regola fissa, ma possiamo dire che vale quasi sempre ) per quanto riguarda M2 è consigliato tenere sempre disattivato il query cache del database, perchè controproducente per il sistema stesso, e molti a loro insaputa lasciano questo valore attivo o peggio ancora con valori altissimi levando risorse a sistemi che ne potrebbero trovare vantaggio.

Il terzo problema che si riscontra, questo per lo più su Hosting economici, piccole VPS sottodimensionate o mal configurate è un enorme utilizzo delle tabelle temporanee sul disco. questo non è un vero e proprio "problema" ma un campanello di allarme, di fatto le tabelle temporanee dovrebbero utilizzare il meno possibile il disco, proprio per evitare rallentamenti dovuti alla latenza del disco.

EAV su Magento: Attivo o non attivo?

Alla luce di quanto abbiamo detto sopra quindi possiamo dire che non sempre è un bene e, anche nei sistemi meglio ottimizzati e performanti l'EAV di Magento può portare problemi di prestazioni con il database.
Sostanzialmente, oltre quanto già accennato sopra, su questo punto ci sarebbe molto di cui parlare, ma soffermandoci su Magento2 ( e lasciando fuori tutte le altre applicazioni ) possiamo affermare che quasi in tutti i casi ( spesso anche ribadito da Adobe ) è sconsigliato tenere attivo l'EAV; per quanto sia un sistema che sulla carta non fa una piega e che nella sua logica di funzionamento permetta molta flessibilità nell'aggiunta di attributi senza alterare le tabelle "core", alla fine si è rilevato un fallimento per Adobe e Magento2 in generale. Di fatto tenere l'EAV attivo porta più contro che pro.

Quindi, la risposta alla tua domanda:
Ma allora posso tenere attivo l'EAV su Magento2 SI o NO?!

No. Ti consiglio di non utilizzare l'EAV su Magento2.

Perchè non dovresti utilizzare l'EAV su Magento2

  • Il tuo database sarà sottoposto ad un maggiore carico di lavoro: il Database effettuerà molte più scritture e letture delle tabelle
  • Il tuo database utilizzerà molte più tabelle temporanee sul disco
  • Il tuo database utilizzerà molti più I/O del sistema, levando risorse ad altri servizi
  • Il tuo Server potrebbe avere un carico CPU costante e leggermente superiore
  • Il tuo sito web potrebbe rischiare di bloccarsi, causando Metadata Lock o Gateway timeout
  • Il database del tuo Sito web potrebbe utilizzare male le tue risorse, portando a dei rallentamenti del sistema
  • A causa dei Lock e timeout delle operazioni potresti ritrovarti con indici bloccati o "pendenti"("Suspended in backlog")
  • A causa dei tuoi (probabili ) riavvii del Mysql per risolvere il problema potresti ritrovarti con indici bloccati o "pendenti"("Suspended in backlog")
  • In generale, l'EAV attivo riduce le performance su Store medio- grandi

Come disattivare o attivare l'EAV su Magento2?

Per poter verificare se il tuo Store ha attivo/disattivo l'EAV, o per modificare l' stato dell'EAV dovrai collegarti al tuo backoffice ed andare in:

Negozi > Configurazione > Catalogo > Catalogo > Ricerca nel catalogo > "Enable EAV Indexer" > Di seguito selezionare NO/SI

Una volta disattivato/attivato l'EAV, è sempre bene digitare da CLI i seguenti comandi:

bin/magento c:f
bin/magento indexer:reset
bin/magento indexer:reindex

Fatto, ora sai cos'è l'EAV, perchè non dovresti utilizzarlo(e soprattutto perchè è dannoso per il suo Sito ) e come puoi disattivare o attivare l'EAV a piacimento 🙂

Consulente esperto IT ed imprenditore digitale.
Mi occupo di consulenza digitale ed IT per professionisti affermati e grandi Aziende sul territorio nazionale che vogliono rendere Affidabile e Sicura la loro presenza Online.

Vuoi ottimizzare le Performance e Costi dell'Hosting del tuo E-commerce?

Stanco dei soliti problemi di Performance del tuo E-commerce? Hai un E-commerce lento con Punteggio Google Pagespeed ridicolo?
Contattami ora, riceverai GRATIS entro 24 ore, una prima analisi professionale del tuo Sito web e ti mostrerò come risolvere i tuoi problemi di Performance ed aumentare il tuo Punteggio Google Pagespeed.
Form pag articolo
wpChatIcon
wpChatIcon
crossmenu linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram