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.
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?
L'EAV come abbiamo detto è un modello struttturato di dati, nel caso specifico di Magento2 incldue principalmente 3 entità:

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:
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:
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.
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.
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 🙂