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
- Apri wp-config.php (preferibilmente in staging).
- Aggiungi: define('SAVEQUERIES', true);
- Aggiungi: define('WPEM_TRACE_SLOW_QUERIES', true);
- Imposta WPEM_SLOW_QUERY_THRESHOLD a 500 (millisecondi).
- Genera traffico tipico (browse, search, checkout).
- Apri WP Error Monitor e filtra 'category = slow_query'.
- Ottieni la top 10 query lente con caller e SQL.
- Ottimizza: aggiungi indici, riduci JOIN, paginate.
- Esegui EXPLAIN sulle query lente per verificare uso indici.
- 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.