Get_option () è più veloce dell'accesso a get_transient ()?


8

Oggi eseguo un test sul mio db per esplorare la differenza di velocità tra l'accesso a una chiave da opzioni, tabella personalizzata e transitori. Ho eseguito il test per 1000 volte e di seguito è riportato il tempo impiegato per eseguire 1000 operazioni get:

  1. get_transient() 0,0245 secondi
  2. get_option() 0,0068 secondi
  3. operazione di selezione semplice dalla tabella personalizzata 0,65 secondi

Ho anche verificato che il transitorio non fosse scaduto durante questo test. Quindi la domanda è: è get_option()più veloce get_transient()o ho sbagliato qualcosa nel mio test? Il ritardo della tabella personalizzata è dovuto alla memorizzazione nella cache delle opzioni predefinite da WordPress? Inoltre, le opzioni sono anche memorizzate nella cache da diversi plug-in di cache come i transitori?


La risposta a questa è variabile, tenendo presente che con una cache degli oggetti, i transitori non useranno affatto le opzioni. Ad ogni modo è una micro-ottimizzazione e una perdita di tempo. Il caricamento automatico come opzione sposta semplicemente il costo altrove
Tom J Nowell

Risposte:


15

Oggi eseguo un test sul mio db per esplorare la differenza di velocità tra l'accesso a una chiave da opzioni, tabella personalizzata e transitori. Ho eseguito il test per 1000 volte e di seguito è riportato il tempo impiegato per eseguire 1000 operazioni get:

Tenere presente che la tabella delle opzioni viene utilizzata sia per le opzioni che per i transitori sulla maggior parte dei sistemi e che la tabella è stata ottimizzata, con l'aggiunta di indici. Quindi non è un confronto equo

get_transient () 0,0245 secondi get_option () 0,0068 secondi operazione di selezione semplice dalla tabella personalizzata 0,65 secondi

Anche questo è un confronto ingiusto, le opzioni con l' autoloadopzione impostata verranno caricate in anticipo in una singola query all'inizio. Quindi get_optionsta tirando da WP_Cache, l'opzione è già stata recuperata.

TLDR: in realtà non sta recuperando l'opzione, è già stata recuperata, ma è semplicemente estratta dalla memoria a causa autoloaddell'opzione

Ho anche verificato che il transitorio non fosse scaduto durante questo test.

Ciò non dovrebbe avere un impatto su un normale sistema sul recupero temporaneo, dopo tutto non sa se è scaduto fino a quando non è stato recuperato.

Quindi la domanda è: get_option () è più veloce di get_transient () o ho sbagliato qualcosa nel mio test?

Dipende:

  • Sulla maggior parte dei sistemi, i transitori vengono archiviati utilizzando le opzioni, entrambi implicano una get_optionchiamata
  • Le opzioni autoloadimpostate su true vengono tutte caricate in una singola chiamata all'inizio, quindi vengono mantenute in memoria, quindi non si verificano query
  • La memorizzazione nella cache degli oggetti memorizza nella cache sia le opzioni caricate automaticamente che i transitori

Il ritardo della tabella personalizzata è dovuto alla memorizzazione nella cache delle opzioni predefinite da WordPress?

Molto possibile, ma quanto velocemente richiede tale selezione dipende molto dalla query e dal design della tabella

Inoltre, le opzioni sono anche memorizzate nella cache da diversi plug-in di cache come i transitori?

Sì, WP_Cacheviene utilizzato, che lo memorizzerà in memoria per il resto della richiesta. I plug-in di memorizzazione nella cache potrebbero conservare questi valori per motivi di prestazioni.

ripetibilità

Questi sono tutti memorizzati nella cache, WP_Cachequindi la seconda volta che lo richiedi, nessun DB è coinvolto.

Variabilità e dipende

Tutto ciò presuppone una base comune, ma per quanto riguarda le cache degli oggetti?

Consente di introdurre un'istanza MemcacheD o un'istanza Redis (consiglio vivamente di farlo se si dispone dell'opzione, VANTAGGI vantaggi prestazionali per siti ben costruiti, soprattutto se li si utilizza per la memorizzazione nella cache delle pagine, a meno che non si abbia qualcosa come l'installazione di Varnish)

Ora abbiamo una nuova situazione:

  • Ora i dati vengono archiviati nella RAM e, una volta recuperati dal DB, vengono caricati e i tempi di accesso vengono drasticamente ridotti. Ancora più lento di una variabile, ma significativamente più veloce di una query del database
  • Molti nuovi dati sono archiviati in quelli WP_Cacheche normalmente non lo sono. Ad esempio WP_Postoggetti, post meta, ecc
  • WP_Cache ora persiste tra le richieste
  • MemcacheD ecc. Può eliminare i transitori scaduti, ecc

Quindi ora i transitori e le opzioni hanno lo stesso costo di accesso. Erano già vicini, ma ora sono trascurabili e hanno più a che fare con il carico della CPU al momento della richiesta.

Quindi per prestazioni dovrei usare i transitori o le opzioni?

Sebbene sia una domanda degna di cui chiedersi, la risposta è che la differenza è trascurabile e nei margini di errore

non è così semplice

Quindi smetti di microottimizzare, sono lo stesso supporto di archiviazione e questo non è degno del tuo tempo

  • Utilizzare le opzioni se è necessario archiviare qualcosa che è a livello di sito
  • Usa i transitori per archiviare temporaneamente le cose che sono costose da calcolare in modo da non doverle andare alla volta successiva

Non vale la pena dedicare del tempo a sceglierne uno in base alle prestazioni, non c'è differenza significativa.

Ci sono cose molto migliori da fare per ottimizzare che offrono risparmi significativamente maggiori, ad esempio usare tassonomie invece di meta nelle query post, non usare __notparametri di stile, fare meno cose sulla pagina, installare una cache degli oggetti, ridurre i post per pagina, evitare richieste remote eccetera

Che dire di un tavolo personalizzato che ...

No, la tabella delle opzioni è già ben ottimizzata, l'utilizzo di una tabella personalizzata sposta semplicemente le operazioni al di fuori del sistema di cache WP, costringendoti a scrivere le tue


Per quanto riguarda, l'opzione è caricata automaticamente nel mio caso. La tabella personalizzata contiene solo due righe e una query di selezione per recuperare i dati.
learning_13

Lo sto facendo per il mio plugin e devo scegliere tra uno qualsiasi di essi. La tabella personalizzata era più semplice da implementare secondo il mio progetto, ma il costo di recupero è abbastanza grande da ritardare il caricamento della pagina.
learning_13

2
@ learning_13, stavi ponendo la domanda sbagliata, e forse sia Tom che io non siamo riusciti a portare il messaggio nelle nostre risposte - Una corretta memorizzazione nella cache renderà qualsiasi cosa tu decida di utilizzare abbastanza performante per i siti che si preoccupano delle prestazioni. La decisione su come archiviare i dati dovrebbe essere presa in base alla struttura del tuo plugin e alla sua funzionalità, le prestazioni dovrebbero essere l'ultima cosa a cui pensare.
Mark Kaplun,

2
@ aim100k, per favore non coinvolgere i "genitori" nelle risposte qui. Ciò che le persone fanno per vivere non dovrebbe essere educato a meno che non sia rilevante per la risposta o la domanda. Se non ti piace una risposta, votala. Se ritieni che la risposta potrebbe essere tecnicamente corretta ma offensiva, puoi provare a modificarla, contrassegnarla o discuterla sul meta sito.
Mark Kaplun,

@ mark-kaplun, diciamo che memorizzo i dati nella tabella personalizzata e prendo i dati da esso per ogni rendering post in cui è coinvolto il mio plugin per mostrare alcuni dati. Quindi, i plug-in di memorizzazione nella cache o l'ottimizzazione della memorizzazione nella cache dell'utente si occuperanno della memorizzazione nella cache di quella tabella? E gli ulteriori sforzi nell'implementazione e nella progettazione cambieranno solo per utilizzare i transitori / opzioni invece di utilizzare una tabella personalizzata che si adatta maggiormente alla mia progettazione una microottimizzazione (prematura) sulla velocità di caricamento della pagina?
learning_13

4

Se non viene trovata alcuna memorizzazione nella cache degli oggetti, get_transientchiama get_optiondue volte, una volta o l'intervallo di scadenza e uno per il valore, quindi non sarà più veloce.

get_optionle prestazioni di per sé saranno influenzate dal fatto che l'opzione sia "caricata automaticamente" (impostazione predefinita) o meno. Tutte le opzioni caricate automaticamente vengono recuperate in una richiesta per il DB e archiviate nella cache di memoria, e quindi dovrebbero avere un impatto minimo su quante volte chiamate get_optionanche se è per opzioni diverse.

Quando si accede direttamente al DB si ignora tutta la memorizzazione nella cache e altri miglioramenti delle prestazioni e si prevede che sia più lento a meno che non si implementa una logica intelligente da soli.

Detto questo, non sono sicuro che il tuo test sia stato positivo, ma a prescindere, l'intera discussione è inutile come se ti interessassero davvero le prestazioni, utilizzerai il sistema di cache degli oggetti (e il relativo plug-in) che porterà molto più vicino il tempo di accesso ai dati a zero .... e ovviamente se si decide di utilizzare le proprie tabelle DB, è necessario integrare le API di accesso con il meccanismo di memorizzazione nella cache degli oggetti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.