SAVEQUERIES WordPress: profilare query lente

SAVEQUERIES: profilare query lente

SAVEQUERIES è la costante WordPress che permette di salvare ogni query SQL eseguita durante una richiesta, con tempo di esecuzione e backtrace. È lo strumento principe per identificare query lente. Vediamo come usarlo in combinazione con WP Error Monitor.

Cosa salva esattamente

Con SAVEQUERIES=true, ogni chiamata a $wpdb->query viene registrata in $wpdb->queries come array: [SQL, time, caller_function]. A fine richiesta puoi ispezionare tutto. Il caller_function viene calcolato via debug_backtrace e ti dice quale plugin/tema ha generato la query. Costo: ~30% di memoria in più su pagine pesanti.

Profiling con Query Monitor

Il plugin Query Monitor consuma direttamente $wpdb->queries e mostra: tempo totale, top 10 query lente, query duplicate, query per plugin/tema/core, errori. È lo strumento gold-standard per chi sviluppa. Funziona solo se SAVEQUERIES=true (lo abilita automaticamente).

Integrazione con WP Error Monitor

Quando WPEM_TRACE_SLOW_QUERIES=true, WP Error Monitor controlla a fine richiesta le query in $wpdb->queries e invia evento se time > soglia (default 500ms). L’evento contiene query, tempo, caller. Così' identifichi query lente anche in produzione, senza dover installare Query Monitor (che impatta troppo).

Indici MySQL per WordPress

L’80% delle query lente WordPress si risolve con indici corretti. Indici predefiniti: wp_posts (post_status, post_type, post_date), wp_postmeta (post_id, meta_key). Indici tipicamente mancanti: wp_options.autoload, wp_usermeta.meta_value. Aggiungi con ALTER TABLE wp_options ADD INDEX autoload_idx. Verifica con SHOW INDEX FROM wp_options. WP Error Monitor con WPEM_TRACE_SLOW_QUERIES=true segnala query che mancano di indici.

Cache layer per query frequenti

Object cache (Redis/Memcached) elimina molte query ripetute. WordPress core mette in cache automaticamente wp_options autoloaded, post object, term, user. Plugin spesso non usano cache correttamente: chiamano wpdb get_results in loop senza cache. WP Error Monitor traccia query NOT cached e ti permette di identificarle: vedi 'Top non-cached queries' con caller. Spesso il fix è un set_transient/get_transient nel plugin custom.

Query Monitor per debug avanzato

Query Monitor (plugin) è lo strumento gold-standard per profiling WordPress: si attiva quando SAVEQUERIES=true ed espone una toolbar admin con tab dedicate per query, hook, HTTP request, redirect, conditionals. Per ogni query: SQL completo, tempo, caller, indice usato (via EXPLAIN). Setup: installa plugin, in dev ha visibility full, in prod restrict a admin via QM_DISABLE_FOR_USERS. Coesistenza con WP Error Monitor: QM è deep-dive interattivo, WPEM è continuous-passive monitoring. Usali insieme: QM quando profili attivamente in dev/staging, WPEM tutto il tempo in prod.

Indici composti per query complesse

Quando una query usa WHERE su più colonne, un'indice composto è più efficace di più indici single. Esempio: SELECT * FROM wp_posts WHERE post_type='product' AND post_status='publish' beneficia di INDEX (post_type, post_status). MySQL usa indice 'leftmost prefix': l’ordine delle colonne nell’indice conta. WP Error Monitor segnala query con 'using filesort' o 'using temporary' come red flag: tipicamente fixable con indice composto. Usa EXPLAIN per verificare prima/dopo l’aggiunta. Caveat: troppi indici rallentano write, bilancia con profilo accessi (mostly-read vs mostly-write).

Mantenere il sito performante nel tempo

Una strategia di mantenimento performance basata su SAVEQUERIES nel tempo: 1) lancia SAVEQUERIES + Query Monitor mensile in staging con copia DB prod recente, 2) identifica top 5 query lente vs mese precedente, 3) ottimizza prima di prossimo mese, 4) traccia query count totale per pagina chiave (homepage, product, checkout) come KPI, 5) alert se cresce 20%+ mese su mese. Così' degradazione progressiva (plugin che aggiunge query, custom code mal scritto) viene catturata precocemente. WP Error Monitor automatizza il tracking se WPEM_TRACE_SLOW_QUERIES=true.

Ottimizzazione cache di transient

Per pagine che richiamano molti meta_value via get_post_meta, usa update_meta_cache per pre-caricare in batch invece di N query separate. Combinato con object cache Redis, riduce drasticamente il numero di query SELECT al database, alleggerendo carico server.

Procedura passo-passo

  1. Apri wp-config.php (preferibilmente in staging).
  2. Aggiungi: define('SAVEQUERIES', true);
  3. Aggiungi: define('WPEM_TRACE_SLOW_QUERIES', true);
  4. Imposta WPEM_SLOW_QUERY_THRESHOLD a 500 (millisecondi).
  5. Genera traffico tipico (browse, search, checkout).
  6. Apri WP Error Monitor e filtra 'category = slow_query'.
  7. Ottieni la top 10 query lente con caller e SQL.
  8. Ottimizza: aggiungi indici, riduci JOIN, paginate.
  9. Esegui EXPLAIN sulle query lente per verificare uso indici.
  10. Aggiungi indici mancanti dopo backup DB.

Errori comuni e come risolverli

  • Memoria esaurita con SAVEQUERIES: Disabilita su pagine pesanti o usa WPEM_TRACE_SLOW_QUERIES senza Query Monitor.
  • Caller sempre 'unknown': debug_backtrace bloccato da plugin: verifica disable_functions in php.ini.
  • Query duplicate inspiegabili: Spesso dovute a get_posts senza cache: usa WP_Query con cache_results=true.
  • Indice creato ma query non lo usa: Statistiche MySQL stale: ANALYZE TABLE per refresh.
  • Redis cache non popolato: Plugin non usa wp_cache_set/wp_cache_get: patch o segnala bug.

Domande frequenti

D: Posso lasciare SAVEQUERIES in produzione?
R: Sconsigliato per impatto memoria: usa WPEM_TRACE_SLOW_QUERIES che è meno invasivo.

D: La soglia 500ms è troppo bassa?
R: Per WooCommerce con prodotti complessi puoi salire a 1000ms.

D: Query Monitor in produzione?
R: Solo per admin, non users normali: configura visibility appropriata.

D: Posso aggiungere indici senza downtime?
R: Sì, online DDL su MySQL 5.7+/MariaDB 10.x supportato.

D: Quanti indici sono troppi?
R: Tipicamente 5-7 per tabella: troppi rallentano write.

Hai bisogno di aiuto?

Se vuoi affidare il monitoraggio WordPress al team di G Tech Group, scrivici tramite il modulo di contatto.

Hai trovato utile quest'articolo?