Il Database WordPress Si Ingolfa. Ecco Come Ripulirlo e Ottimizzarlo.
Un’installazione WordPress fresca ha 12 tabelle e pesa pochi MB. Dopo 2 anni di uso, 30 plugin installati (e 15 disinstallati), 500 post con revisioni infinite, e transient mai puliti: il database pesa 500MB+ e le query sono lente.
L’ottimizzazione del database è la manutenzione che nessuno fa ma che tutti dovrebbero schedulare mensilmente.
Le 5 Fonti di Bloat
1. Revisioni dei Post
WordPress salva una revisione per ogni salvataggio. Un post modificato 50 volte ha 50 revisioni nel database. Per 500 post: 25.000 righe inutili.
# Conta le revisioni
wp post list --post_type=revision --format=count
# Output tipico: 12847
# Limita le revisioni future (wp-config.php)
define('WP_POST_REVISIONS', 5); // Tieni solo le ultime 5
# Pulisci le revisioni esistenti (WP-CLI)
wp post delete $(wp post list --post_type=revision --format=ids) --force
2. Transient Scaduti
I transient sono cache temporanee nel database. Plugin li creano e spesso non li puliscono.
wp transient delete --expired
# O con query diretta
wp db query "DELETE FROM wp_options WHERE option_name LIKE '%_transient_%' AND option_value < UNIX_TIMESTAMP()"
3. Tabelle Orfane di Plugin Disinstallati
# Mostra tutte le tabelle non-standard
wp db query "SHOW TABLES" | grep -v -E "wp_(posts|postmeta|options|users|usermeta|terms|term_taxonomy|term_relationships|comments|commentmeta|links)"
Se vedi tabelle di plugin che hai disinstallato 2 anni fa, eliminale (dopo backup!).
4. Autoloaded Options
La tabella wp_options ha un campo "autoload". Le righe con autoload=yes vengono caricate in RAM a OGNI pageview. Plugin spesso impostano autoload=yes su dati enormi.
# Trova le opzioni autoloaded più pesanti
wp db query "SELECT option_name, LENGTH(option_value) as size FROM wp_options WHERE autoload='yes' ORDER BY size DESC LIMIT 20"
Se trovi opzioni da 1MB+ con autoload=yes: cambia a autoload=no se il plugin lo permette.
5. Commenti Spam e Trash
wp comment delete $(wp comment list --status=spam --format=ids) --force
wp comment delete $(wp comment list --status=trash --format=ids) --force
Ottimizzazione Indici MySQL
# Ottimizza tutte le tabelle WordPress
wp db optimize
# Analizza le query lente (richiede slow query log abilitato)
# In my.cnf: slow_query_log = 1, long_query_time = 1
tail -50 /var/log/mysql/slow-query.log
Script di Manutenzione Mensile
#!/bin/bash
# db-maintenance.sh - Eseguire mensilmente
SITE_PATH="/var/www/html"
cd "$SITE_PATH"
echo "=== Database Maintenance ==="
echo "Size prima: $(wp db size --format=csv | tail -1)"
wp post delete $(wp post list --post_type=revision --format=ids 2>/dev/null) --force 2>/dev/null
wp transient delete --expired 2>/dev/null
wp comment delete $(wp comment list --status=spam --format=ids 2>/dev/null) --force 2>/dev/null
wp comment delete $(wp comment list --status=trash --format=ids 2>/dev/null) --force 2>/dev/null
wp db optimize 2>/dev/null
echo "Size dopo: $(wp db size --format=csv | tail -1)"
FAQ
L'ottimizzazione del database causa downtime?
No per la pulizia (DELETE). L'OPTIMIZE TABLE può causare un lock breve sulle tabelle grandi (>1GB). Per tabelle InnoDB (standard dal MySQL 5.5), il lock è minimo. Fallo fuori orario di punta per sicurezza.
Quanto spesso pulire il database?
Mensilmente per siti attivi. Trimestralmente per siti statici. Il cron job sopra schedulato mensilmente è la soluzione ideale.