Home Chi Sono
Servizi
WordPress Sviluppo Web Server & Hosting Assistenza Tecnica Windows Android
Blog
Tutti gli Articoli WordPress Hosting Plesk Assistenza Computer Windows Android A.I.
Contatti

Come Pulisco il Database WordPress per Velocizzare il Sito: La Mia Procedura

Database e codice per pulizia e ottimizzazione WordPress

Se gestisci un sito WordPress da qualche anno, ti sarai accorto che con il passare del tempo diventa sempre più lento. Le pagine impiegano più secondi a caricarsi, il backend si trascina e le query al database sembrano non finire mai. Il colpevole, nella maggior parte dei casi, non è il tema o i plugin: è il database. Un database WordPress che non viene mai pulito accumula una quantità impressionante di dati inutili: revisioni di articoli, auto-draft, transient scaduti, metadati orfani, commenti spam e tabelle abbandonate da plugin disinstallati. Ho visto database di siti con poche centinaia di articoli pesare oltre 500 MB, quando avrebbero dovuto occuparne 30. In questa guida ti mostro esattamente la procedura che seguo io, Dario Iannascoli, per ripulire il database WordPress e riportare il sito a prestazioni ottimali.

Questa non è una guida teorica. È il risultato di anni di esperienza diretta nella manutenzione di decine di siti WordPress, dal piccolo blog personale al portale aziendale con migliaia di pagine. La procedura che descrivo qui l’ho affinata nel tempo, partendo da errori che mi sono costati ore di lavoro e qualche notte insonne. La regola fondamentale che ho imparato è semplice: prima fai il backup, poi tocchi il database. Nessuna eccezione. Vedrai che seguendo i miei passaggi riuscirai a ridurre drasticamente le dimensioni del database, abbattere i tempi di risposta delle query e, in definitiva, velocizzare l’intero sito. Ti mostrerò sia l’approccio con plugin sia le query SQL manuali per chi preferisce avere il controllo totale. Partiamo.

Cosa Gonfia il Database WordPress: I Nemici delle Prestazioni

Per capire come pulire il database, devi prima sapere cosa lo sporca. WordPress, per sua natura, tende ad accumulare dati che non servono più. Il problema è che non li elimina mai da solo. Ecco i principali responsabili del bloat del database, quelli che trovo sistematicamente in ogni installazione che analizzo:

  • Revisioni degli articoli (post revisions) – Ogni volta che salvi un articolo, WordPress crea una revisione nella tabella wp_posts. Un articolo modificato 50 volte avrà 50 revisioni. Moltiplica per centinaia di articoli e capisci il problema. Ho trovato siti con oltre 20.000 revisioni che occupavano più spazio degli articoli stessi. WordPress non impone un limite di default, quindi le revisioni crescono senza controllo.
  • Auto-draft e articoli cestinati – WordPress salva automaticamente una bozza ogni 60 secondi mentre scrivi. Questi auto-draft restano nel database anche quando l’articolo è stato pubblicato. Allo stesso modo, gli articoli nel cestino non vengono eliminati definitivamente finché non li svuoti manualmente. Spesso restano lì per mesi o anni.
  • Transient scaduti – I transient sono dati temporanei che WordPress e i plugin salvano nella tabella wp_options per velocizzare operazioni ripetitive. Il problema è che molti transient scaduti non vengono rimossi automaticamente. Col tempo si accumulano a migliaia, rallentando ogni query sulla tabella wp_options, che è una delle più consultate.
  • Metadati orfani – Quando elimini un articolo, un commento o un utente, WordPress non sempre cancella i relativi metadati dalle tabelle wp_postmeta, wp_commentmeta e wp_usermeta. Questi record orfani occupano spazio e rallentano le JOIN nelle query. Ho visto tabelle wp_postmeta con milioni di righe, di cui il 40% erano orfane.
  • Commenti spam – Se usi Akismet o un altro sistema antispam, i commenti marcati come spam restano nel database nella tabella wp_comments insieme ai relativi metadati. Un sito popolare può accumulare decine di migliaia di commenti spam in pochi mesi se non li elimini regolarmente.
  • Tabelle orfane di plugin disinstallati – Questo è uno dei problemi più subdoli. Molti plugin creano le proprie tabelle nel database durante l’installazione, ma non le rimuovono quando li disinstalli. Dopo anni di prove e cambi di plugin, il database si riempie di tabelle inutili che nessuno usa più. Ho trovato database con 30-40 tabelle orfane lasciate da plugin rimossi anni prima.
  • Dati nella tabella wp_options con autoload – La tabella wp_options viene caricata quasi interamente in memoria a ogni richiesta, specialmente le righe con autoload=yes. Plugin mal scritti inseriscono grandi quantità di dati con autoload attivo, rallentando ogni singolo caricamento di pagina. Questa è spesso la causa nascosta di lentezze inspiegabili.

Backup del Database: Il Passo Zero Obbligatorio

Non mi stancherò mai di ripeterlo: prima di toccare qualsiasi cosa nel database, fai un backup completo. Non importa quanto sei esperto, non importa quanto sei sicuro della query che stai per eseguire. Un errore in una DELETE senza WHERE può cancellare l’intero contenuto di una tabella in un istante. Ecco come faccio io il backup prima di ogni operazione di pulizia:

  1. Backup con mysqldump da riga di comando – Il metodo più affidabile. Accedo al server via SSH ed eseguo: mysqldump -u nome_utente -p nome_database > backup_pre_pulizia_$(date +%Y%m%d).sql. Questo crea un file SQL completo con struttura e dati di tutte le tabelle. Verifico sempre che il file abbia una dimensione coerente e che termini con il dump delle tabelle, non con un errore.
  2. Backup tramite phpMyAdmin – Se non hai accesso SSH, apri phpMyAdmin dal pannello di controllo hosting, seleziona il database WordPress, clicca su Esporta, scegli il metodo Personalizzato, assicurati che tutte le tabelle siano selezionate, formato SQL, e clicca Esegui. Salva il file .sql sul tuo computer locale.
  3. Backup con plugin WordPress – Se non hai accesso al database direttamente, usa un plugin come UpdraftPlus o All-in-One WP Migration. Vai in Impostazioni > UpdraftPlus, clicca su Backup adesso e assicurati che sia selezionata l’opzione Database. Il backup verrà salvato nella cartella wp-content/updraft del tuo server.
  4. Verifica del backup – Non mi fido mai di un backup che non ho verificato. Creo un database di test, importo il backup con mysql -u utente -p database_test < backup.sql e controllo che le tabelle ci siano tutte e contengano dati. Solo dopo questa verifica procedo con la pulizia. Questa fase richiede cinque minuti ma può salvarti ore di disperazione.
  5. Conservazione del backup – Tengo il backup della pre-pulizia per almeno 30 giorni, sia sul server sia scaricato in locale. Lo etichetto chiaramente con la data e il motivo, ad esempio backup_pre_pulizia_database_20260207.sql. Mai sovrascrivere un backup con uno più recente finché non sei certo che tutto funzioni correttamente dopo la pulizia.

Pulizia con Plugin: WP-Optimize e Advanced Database Cleaner

Per chi preferisce un approccio guidato e sicuro, i plugin di pulizia database rappresentano la scelta migliore. Ne ho provati molti nel corso degli anni e i due che consiglio sono WP-Optimize e Advanced Database Cleaner. Entrambi fanno un ottimo lavoro, ma con approcci leggermente diversi. Ecco come li uso nella mia procedura quotidiana di manutenzione:

  1. Installazione di WP-Optimize – Vai in Plugin > Aggiungi nuovo, cerca WP-Optimize e installalo. Questo plugin è sviluppato dallo stesso team di UpdraftPlus ed è estremamente affidabile. Dopo l’attivazione, trovi il menu WP-Optimize nella sidebar di WordPress. La sezione Database ti mostra immediatamente quanti dati inutili ha rilevato.
  2. Eseguire la pulizia con WP-Optimize – Nella scheda Database, trovi un elenco di categorie: revisioni, auto-draft, commenti spam, commenti cestinati, transient scaduti, tabelle non ottimizzate. Per ogni categoria vedi il numero di elementi trovati. Seleziona tutte le categorie che vuoi pulire e clicca Esegui ottimizzazione. Ti consiglio di procedere una categoria alla volta la prima volta, verificando dopo ogni passaggio che il sito funzioni correttamente.
  3. Advanced Database Cleaner per le tabelle orfane – Dove WP-Optimize eccelle nella pulizia dei dati, Advanced Database Cleaner è superiore nel rilevamento delle tabelle orfane. Dopo l’installazione, vai nella sezione Tables e il plugin ti mostrerà quali tabelle non appartengono a nessun plugin attivo. Controlla ogni tabella segnalata prima di eliminarla: a volte tabelle apparentemente orfane sono usate da temi o da codice personalizzato nel functions.php.
  4. Pulizia della tabella wp_options – WP-Optimize ha una funzione specifica per analizzare la tabella wp_options e identificare i transient scaduti e le righe con autoload=yes che occupano troppo spazio. Nella versione premium puoi anche gestire l’autoload, ma nella versione gratuita la pulizia dei transient è già disponibile e molto efficace. Ho visto riduzioni della tabella wp_options da 50 MB a 2 MB dopo questa operazione.
  5. Ottimizzazione delle tabelle – Dopo la pulizia dei dati, è fondamentale eseguire l’OPTIMIZE TABLE su tutte le tabelle. WP-Optimize lo fa con un click nella sezione dedicata. Questa operazione riorganizza fisicamente i dati nelle tabelle, recuperando lo spazio lasciato dai record eliminati e migliorando le prestazioni delle query. È come deframmentare un disco rigido: i dati ci sono ancora, ma sono organizzati meglio.

Query SQL Manuali per la Pulizia: Il Controllo Totale

Quando devo fare una pulizia chirurgica o quando lavoro su server dove non posso installare plugin, ricorro alle query SQL manuali. Questo approccio richiede più attenzione ma offre un controllo totale su cosa viene eliminato. Accedo a phpMyAdmin o uso la riga di comando MySQL e eseguo le seguenti query. Ricorda: backup prima di tutto. Ogni query va testata prima con una SELECT per verificare cosa verrà eliminato, poi convertita in DELETE.

  1. Eliminare tutte le revisioni degli articoli – Questa è la query che uso più frequentemente. Prima verifico quante revisioni ci sono: SELECT COUNT(*) FROM wp_posts WHERE post_type = ‘revision’;. Poi elimino le revisioni e i relativi metadati: DELETE a, b, c FROM wp_posts a LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id) WHERE a.post_type = ‘revision’;. Questa query elimina revisioni, relazioni con le tassonomie e metadati in un colpo solo.
  2. Eliminare gli auto-draft – Gli auto-draft sono bozze automatiche che WordPress crea durante la scrittura: DELETE FROM wp_posts WHERE post_status = ‘auto-draft’;. Segui con DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT ID FROM wp_posts); per rimuovere i metadati orfani risultanti. Questa seconda query è fondamentale e va eseguita dopo ogni eliminazione di record dalla tabella wp_posts.
  3. Eliminare i transient scaduti – I transient scaduti nella tabella wp_options si eliminano con: DELETE FROM wp_options WHERE option_name LIKE ‘_transient_timeout_%’ AND option_value < UNIX_TIMESTAMP(); seguita da DELETE FROM wp_options WHERE option_name LIKE ‘_transient_%’ AND option_name NOT LIKE ‘_transient_timeout_%’ AND option_name NOT IN (SELECT REPLACE(option_name, ‘_transient_timeout_’, ‘_transient_’) FROM (SELECT option_name FROM wp_options WHERE option_name LIKE ‘_transient_timeout_%’) AS t);. In alternativa, una versione più semplice: DELETE FROM wp_options WHERE option_name LIKE ‘%_transient_%’; che elimina tutti i transient, anche quelli non scaduti (verranno ricreati automaticamente).
  4. Eliminare i commenti spam e cestinati – Per i commenti spam: DELETE FROM wp_comments WHERE comment_approved = ‘spam’;. Per i commenti nel cestino: DELETE FROM wp_comments WHERE comment_approved = ‘trash’;. Dopo entrambe le operazioni, pulisci i metadati orfani: DELETE FROM wp_commentmeta WHERE comment_id NOT IN (SELECT comment_id FROM wp_comments);. Ho gestito un sito che aveva accumulato 180.000 commenti spam in due anni: la sola eliminazione di questi ha ridotto il database di 120 MB.
  5. Eliminare i metadati orfani – Questa è la pulizia più importante dopo le eliminazioni precedenti. Per i post meta: DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts p ON pm.post_id = p.ID WHERE p.ID IS NULL;. Per i comment meta: DELETE cm FROM wp_commentmeta cm LEFT JOIN wp_comments c ON cm.comment_id = c.comment_id WHERE c.comment_id IS NULL;. Per le relazioni con le tassonomie: DELETE tr FROM wp_term_relationships tr LEFT JOIN wp_posts p ON tr.object_id = p.ID WHERE p.ID IS NULL;.
  6. Ottimizzare le tabelle dopo la pulizia – Dopo tutte le eliminazioni, ottimizza ogni tabella per recuperare lo spazio: OPTIMIZE TABLE wp_posts, wp_postmeta, wp_options, wp_comments, wp_commentmeta, wp_term_relationships, wp_termmeta, wp_terms;. Questa operazione può richiedere diversi minuti su database grandi. Non interromperla. Al termine, verifica le dimensioni del database con: SELECT table_name, ROUND(((data_length + index_length) / 1024 / 1024), 2) AS ‘Size (MB)’ FROM information_schema.tables WHERE table_schema = ‘nome_database’ ORDER BY (data_length + index_length) DESC;.

Limitare le Revisioni e gli Auto-Save in wp-config.php

Pulire il database è importante, ma prevenire l’accumulo di dati inutili è ancora meglio. WordPress offre alcune costanti che puoi definire nel file wp-config.php per limitare le revisioni e la frequenza degli auto-save. Queste impostazioni sono la prima cosa che configuro su ogni nuova installazione WordPress. Ecco le modifiche che consiglio e come implementarle correttamente:

  1. Limitare il numero di revisioni – Aggiungi questa riga nel file wp-config.php, prima della riga “/* That’s all, stop editing! */”: define(‘WP_POST_REVISIONS’, 5);. Questo limita le revisioni a 5 per ogni articolo. Personalmente uso il valore 5 perché mi permette di tornare indietro se necessario, senza accumulare decine di versioni inutili. Se vuoi disabilitare completamente le revisioni, usa il valore false: define(‘WP_POST_REVISIONS’, false); ma lo sconsiglio perché perdi la possibilità di recuperare versioni precedenti.
  2. Aumentare l’intervallo di auto-save – Di default WordPress salva una bozza automatica ogni 60 secondi. Puoi aumentare questo intervallo con: define(‘AUTOSAVE_INTERVAL’, 300);. Il valore è in secondi, quindi 300 significa un auto-save ogni 5 minuti. Questo riduce significativamente il numero di auto-draft creati durante la scrittura. Non consiglio intervalli superiori a 5 minuti perché rischi di perdere troppo lavoro in caso di crash del browser.
  3. Svuotare il cestino automaticamente – WordPress può svuotare automaticamente il cestino dopo un certo numero di giorni. Aggiungi: define(‘EMPTY_TRASH_DAYS’, 7);. Questo elimina definitivamente gli articoli e i commenti nel cestino dopo 7 giorni. Il valore di default è 30 giorni, che per la maggior parte dei siti è troppo. Sette giorni sono sufficienti per accorgersi di un’eliminazione accidentale. Se vuoi disabilitare il cestino completamente, usa il valore 0, ma te lo sconsiglio fortemente.
  4. Disabilitare la compressione delle revisioni – In wp-config.php puoi anche configurare la costante WP_MEMORY_LIMIT per assicurarti che le operazioni di pulizia del database abbiano abbastanza memoria: define(‘WP_MEMORY_LIMIT’, ‘256M’);. Questo non è direttamente legato alle revisioni, ma è importante quando esegui operazioni massive sul database tramite plugin come WP-Optimize.
  5. Verificare le impostazioni – Dopo aver aggiunto le costanti, verifica che funzionino. Crea un nuovo articolo, salvalo 10 volte e controlla quante revisioni vengono create. Dovrebbero essere al massimo 5 (o il numero che hai impostato). Puoi verificare anche dall’editor: nella sidebar a destra dell’editor Gutenberg, la sezione “Revisioni” mostrerà al massimo il numero configurato. Se le revisioni non vengono limitate, controlla che la costante sia definita prima della riga require_once nel wp-config.php.

Schedulare la Pulizia Automatica e Monitorare i Risultati

Una pulizia fatta una volta sola serve a poco se non viene ripetuta regolarmente. Il database torna a gonfiarsi nel giro di poche settimane, specialmente su siti con pubblicazioni frequenti e molto traffico. La soluzione è automatizzare la pulizia e monitorare costantemente le dimensioni e le prestazioni del database. Ecco come organizzo la manutenzione automatica sui siti che gestisco:

  1. Schedulare la pulizia con WP-Optimize – WP-Optimize offre una funzione di pulizia programmata nella scheda Settings. Puoi impostare una pulizia automatica settimanale o bisettimanale che elimina revisioni, auto-draft, transient scaduti e commenti spam. Io imposto una pulizia settimanale ogni domenica alle 3:00 di notte, quando il traffico è minimo. Assicurati di selezionare anche l’opzione per ottimizzare le tabelle durante la pulizia programmata.
  2. Creare un cron job personalizzato – Per un controllo maggiore, creo un cron job che esegue le query SQL di pulizia tramite WP-CLI. Il comando è: wp db query “DELETE FROM wp_posts WHERE post_type = ‘revision'” –path=/var/www/html/wordpress. Lo inserisco nel crontab del server con: 0 3 * * 0 /usr/local/bin/wp db query “DELETE FROM wp_posts WHERE post_type = ‘revision'” –path=/var/www/html/wordpress. Questo esegue la pulizia delle revisioni ogni domenica alle 3:00.
  3. Monitorare le dimensioni del database – Uso uno script bash che controlla settimanalmente le dimensioni del database e mi invia un’email se superano una soglia. Lo script esegue la query SELECT SUM(data_length + index_length) FROM information_schema.tables WHERE table_schema = ‘nome_db’ e confronta il risultato con il valore atteso. Se il database supera una certa dimensione, significa che qualcosa sta accumulando dati più del previsto e devo investigare.
  4. Confrontare i tempi di query prima e dopo – Per misurare l’impatto della pulizia, uso il plugin Query Monitor che mostra il numero e il tempo di esecuzione di tutte le query SQL su ogni pagina. Prima della pulizia, annoto il numero totale di query e il tempo totale. Dopo la pulizia, confronto i valori. Nella mia esperienza, una buona pulizia riduce il tempo totale delle query del 30-60% e il numero di query lente (quelle oltre i 50ms) del 70-80%. Su un sito che gestisco, il tempo medio di risposta è passato da 2.3 secondi a 0.8 secondi dopo la prima pulizia completa.
  5. Analizzare le query lente con il slow query log – Abilito il slow query log di MySQL per identificare le query che richiedono più tempo. Nel file my.cnf aggiungo: slow_query_log = 1, slow_query_log_file = /var/log/mysql/slow.log, long_query_time = 1. Questo registra tutte le query che impiegano più di 1 secondo. Analizzo il log con mysqldumpslow per trovare le query più frequenti e più lente. Spesso scopro che le query lente coinvolgono tabelle non ottimizzate o con indici mancanti, problemi che la pulizia e l’ottimizzazione risolvono.

FAQ – Domande Frequenti sulla Pulizia del Database WordPress

Posso danneggiare il sito pulendo il database?

Sì, se non fai attenzione puoi causare danni seri. Ecco perché il backup è obbligatorio prima di qualsiasi operazione. Le query di pulizia che ho descritto sono sicure se eseguite correttamente, ma un errore di battitura in una query DELETE può cancellare dati importanti. Se non ti senti sicuro con le query SQL, usa un plugin come WP-Optimize che offre le stesse funzionalità con un’interfaccia grafica e controlli di sicurezza integrati. In ogni caso, testa sempre su un ambiente di staging prima di operare sul sito in produzione.

Ogni quanto dovrei pulire il database?

Dipende dall’attività del sito. Per un blog con 2-3 pubblicazioni a settimana, una pulizia mensile è sufficiente. Per un e-commerce o un sito con molti utenti e commenti, consiglio una pulizia settimanale automatizzata. La regola che seguo io è: se il database cresce di più del 10% al mese senza che ci sia un aumento proporzionale dei contenuti, è ora di pulire. Monitorando le dimensioni del database nel tempo, troverai il ritmo giusto per il tuo sito specifico.

WP-Optimize è sicuro da usare?

WP-Optimize è uno dei plugin più affidabili per la pulizia del database WordPress. Ha oltre un milione di installazioni attive e viene aggiornato regolarmente. Lo uso personalmente su tutti i siti che gestisco senza aver mai avuto problemi. Tuttavia, come per qualsiasi operazione sul database, consiglio sempre di fare un backup prima di eseguire la pulizia, anche con il plugin. WP-Optimize stesso ti ricorda di farlo prima della prima pulizia.

Le revisioni sono davvero utili? Posso eliminarle tutte?

Le revisioni sono utili come sistema di versionamento dei contenuti. Se modifichi un articolo e il risultato non ti piace, puoi tornare a una versione precedente. Tuttavia, avere 50 revisioni per articolo è eccessivo. Il mio consiglio è di eliminare le revisioni vecchie e limitare quelle future a 3-5 per articolo tramite la costante WP_POST_REVISIONS in wp-config.php. Così mantieni la funzionalità senza sprecare spazio.

La pulizia del database influisce sulla SEO?

La pulizia del database non ha effetti diretti sulla SEO, perché elimina solo dati interni che non sono visibili ai motori di ricerca (revisioni, transient, metadati orfani). Tuttavia, ha un effetto indiretto molto positivo: un sito più veloce viene premiato da Google nel ranking. La velocità di caricamento è un fattore di ranking confermato, e un database pulito e ottimizzato contribuisce significativamente a ridurre i tempi di risposta del server (TTFB). Quindi sì, pulire il database aiuta la SEO, anche se indirettamente.

Cosa succede ai dati di WooCommerce durante la pulizia?

Se usi WooCommerce, fai molta attenzione durante la pulizia. Le tabelle di WooCommerce contengono dati degli ordini, dei prodotti e dei clienti che non devono essere eliminati. WP-Optimize riconosce le tabelle di WooCommerce e le tratta con cautela. Se usi query SQL manuali, assicurati di non toccare le tabelle che iniziano con wp_wc_ o wp_woocommerce_. La pulizia delle revisioni e dei transient è sicura anche con WooCommerce, ma evita di eliminare metadati dalla tabella wp_postmeta senza verificare che non appartengano a ordini o prodotti.

La Mia Soluzione Definitiva

La pulizia del database WordPress è una delle attività di manutenzione più sottovalutate, eppure ha un impatto enorme sulle prestazioni del sito. Nel corso degli anni ho sviluppato una procedura che combina prevenzione e manutenzione: configuro le costanti in wp-config.php subito dopo l’installazione per limitare revisioni e auto-save, installo WP-Optimize con pulizia automatica settimanale, e una volta al mese eseguo una pulizia manuale approfondita con query SQL per eliminare metadati orfani e tabelle abbandonate. Monitoro tutto con Query Monitor e il slow query log di MySQL. I risultati parlano da soli: database più leggeri del 60-80%, tempi di query dimezzati e siti che rispondono in meno di un secondo. Se il tuo sito WordPress è diventato lento e non sai da dove cominciare, la pulizia del database è quasi sempre la prima cosa da fare. Se hai bisogno di una mano per ottimizzare il tuo database WordPress o vuoi una consulenza personalizzata sulla manutenzione del tuo sito, contattami direttamente dalla mia pagina contatti: sarò felice di aiutarti a rimettere in forma il tuo sito.

Share: