Se il tuo plugin avrà MOLTI dati, utilizzare wp_postmeta
NON è una buona idea, come dimostrato di seguito:
Prendendo ad esempio WooCommerce, in un negozio con ~ 30.000 prodotti, ci sarà una media di, diciamo, ~ 40 post meta (attributi e tutto) per prodotto, 5 immagini di prodotto per prodotto, il che significa che ci saranno ~ 4 meta meta per ogni immagine:
30.000 prodotti x 40 meta ciascuno = 1.200.000 righe in wp_postmeta
+
30.000 prodotti x 5 immagini ciascuno x 4 meta immagine per ciascuno = 600.000 righe in wp_postmeta
Quindi, con solo 30.000 prodotti, stai visualizzando 1.800.000 di righe wp_postmeta
.
Se aggiungi più proprietà ai tuoi prodotti o alle immagini dei tuoi prodotti, questo numero si moltiplica.
Il problema è duplice:
- I self-join sono molto costosi con MySQL
wp_postmeta
la tabella non viene indicizzata a meno che non si utilizzino versioni successive di mysql (ovvero nessun indice FULLTEXT per meta_value
)
Per dare un esempio da un caso reale:
SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE '_shipping_city'
Questo seleziona la città di spedizione da tutti i dettagli dell'ordine arriva in un enorme ~ 3 secondi su un server dedicato entry level anche se ci sono 5-10 ordini . Questo perché la query viene eseguita da una wp_postmeta
tabella con ~ 3 milioni di righe nell'installazione live.
Anche la home page è piuttosto lenta, perché il tema estrae vari elementi da wp_postmeta
- cursori, alcuni inserti di recensione, alcuni altri meta. In generale l'elenco dei prodotti è molto lento, le ricerche sono altrettanto lente quando si elencano i prodotti.
Non è possibile risolvere questo con qualsiasi mezzo normale. Puoi inserire Elastic Search nel tuo server e utilizzare un plug-in Elastic Search in Wordpress, puoi utilizzare redis / memcached, puoi utilizzare un buon plug-in di cache della pagina, ma alla fine rimarrà un problema fondamentale: recuperare qualsiasi quantità di dati da un gonfio wp_postmeta
la tabella sarà lenta, ogni volta che viene eseguita. Sul server in cui ho testato la soluzione che ho implementato di seguito, tutti questi sono stati installati e configurati correttamente e ottimizzati e il sito ha funzionato piacevolmente bene per gli utenti non registrati o per le domande più frequenti da quando sono iniziati i plug-in di cache.
Ma nel momento in cui un utente che ha effettuato l'accesso ha tentato di fare qualcosa che non era comunemente fatto o che i croni, i plug-in di cache o qualsiasi altra utilità volessero recuperare i dati effettivi dal db per memorizzarli nella cache o fare qualsiasi altra cosa, le cose sono andate piano piano.
Quindi ho provato qualcos'altro:
Ho codificato un piccolo plugin per portare tutti i meta del prodotto (postmeta per prodotto di tipo post ) su una tabella personalizzata generata dal codice. Questo plugin ha preso tutti i meta per ogni post e ha creato una tabella aggiungendo ogni meta come colonne e inserendo i valori in ogni riga. Ho trasformato il formato EAV in un formato relazionale orizzontale e piatto. Ho anche avuto il plug-in per eliminare postmeta da tutti i prodotti spostati dalla wp_postmeta
tabella.
Mentre ci sono, ho spostato l' allegato postmeta e tutti gli altri meta del tipo di post nelle proprie tabelle.
Quindi ho agganciato al get_(post_type)_meta
filtro per sovrascrivere il recupero dei metadati per servirli da nuove tabelle personalizzate.
Ora la stessa query precedente, che impiegava ~ 3 secondi per il recupero, wp_postmeta
impiega ~ 0,006 secondi. Il sito ora si comporta come se fosse una nuova installazione di WP.
....................
Naturalmente, fare le cose nel modo Wordpress è meglio. In realtà è la norma.
Tuttavia , è anche evidente che la tabella EAV è molto inefficiente nel ridimensionamento. È infinitamente flessibile e ti consente di archiviare qualsiasi dato, ma il prezzo che paghi per questo è la prestazione. È un compromesso fondamentale.
In quel contesto, è difficile dire a qualcuno che ha intenzione di avere un mucchio di dati e - dio non voglia - interrogare / cercare su quei dati per usare la wp_postmeta
tabella di sicuro. Il successo delle prestazioni sarà eccezionale.
L'uso delle tabelle personalizzate consentirà di accumulare i tuoi dati e rimanere comunque abbastanza veloci.
Proprio come Pippin Williams, il creatore del plug-in Easy Digital Downloads, ha menzionato che userebbe tabelle personalizzate se stesse appena iniziando a programmare il suo plug-in, se hai intenzione di creare qualcosa che verrà utilizzato per molto tempo o accumulare molti dati, è più efficiente usare le tue tabelle personalizzate se le progetti bene.
È necessario assicurarsi che qualsiasi altro sviluppatore di plug-in / addon disponga di mezzi per collegarsi al plug-in per manipolare i dati prima e dopo il recupero dei dati. Se lo fai, allora sei piuttosto solido.