Un database WordPress gonfio è una delle cause principali di TTFB (Time To First Byte) elevato. Revisioni infinite, transients mai puliti e postmeta orfani possono far crescere il database di 10x rallentando ogni query.
Diagnosi: Quanto è Gonfio il Database?
# Dimensione totale e per tabella
wp db size --tables --human-readable
# Output tipico di un sito "malato":
+-------------------+--------+
| Name | Size |
+-------------------+--------+
| wp_options | 45 MB | ← Dovrebbe essere ~2-5MB
| wp_postmeta | 120 MB | ← Spesso piena di orfani
| wp_posts | 80 MB | ← Include revisioni
+-------------------+--------+
| Total | 280 MB |
+-------------------+--------+
1. Pulizia Revisioni
WordPress salva ogni modifica come “revisione”. Un post modificato 100 volte = 100 copie nel database.
# Conta revisioni totali
wp post list --post_type=revision --format=count
# Output: 12847 (!)
# Elimina TUTTE le revisioni
wp post delete $(wp post list --post_type=revision --format=ids) --force
# Oppure mantieni le ultime N per post
wp db query "DELETE FROM wp_posts WHERE post_type = 'revision'
AND ID NOT IN (
SELECT * FROM (
SELECT ID FROM wp_posts WHERE post_type = 'revision'
ORDER BY post_date DESC LIMIT 500
) tmp
)"
Limitare Revisioni Future
// wp-config.php - Mantieni solo 5 revisioni per post
define( 'wp_POST_REVISIONS', 5 );
// Oppure disabilita completamente (sconsigliato)
define( 'wp_POST_REVISIONS', false );
2. Pulizia Transients
I transients sono cache temporanee nel database. Plugin mal scritti li creano ma non li puliscono mai.
# Conta transients
wp db query "SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '%_transient_%'"
# Output: 8542
# Elimina transients scaduti
wp transient delete --expired
# Elimina TUTTI i transients (aggressive)
wp transient delete --all
# Elimina transients specifici di un plugin problematico
wp db query "DELETE FROM wp_options WHERE option_name LIKE '%_transient_wc_%'"
3. Pulizia wp_options (Autoload)
La tabella wp_options con autoload=yes viene caricata ad OGNI richiesta. Troppe righe = TTFB alto.
# Conta righe autoload (idealmente < 500)
wp db query "SELECT COUNT(*) FROM wp_options WHERE autoload = 'yes'"
# Output: 2847 (troppo!)
# Trova le options autoload più pesanti
wp db query "SELECT option_name, LENGTH(option_value) as size
FROM wp_options
WHERE autoload='yes'
ORDER BY size DESC
LIMIT 30"
# Disabilita autoload per options grandi non critiche
wp db query "UPDATE wp_options SET autoload='no'
WHERE option_name IN ('rewrite_rules', 'large_plugin_data')"
4. Pulizia wp_postmeta Orfani
Quando elimini un post, i suoi metadati spesso rimangono. Anni di accumulo = tabella enorme.
# Conta postmeta orfani
wp db query "SELECT COUNT(*) FROM wp_postmeta
WHERE post_id NOT IN (SELECT ID FROM wp_posts)"
# Output: 45678
# BACKUP prima di eliminare!
wp db export backup-pre-cleanup.sql
# Elimina postmeta orfani
wp db query "DELETE FROM wp_postmeta
WHERE post_id NOT IN (SELECT ID FROM wp_posts)"
5. Ottimizzazione Tabelle
Dopo le pulizie, ottimizza le tabelle per recuperare spazio e riorganizzare gli indici:
# Ottimizza tutte le tabelle
wp db optimize
# Ripara eventuali tabelle corrotte
wp db repair
# Verifica integrità
wp db check
Script Completo di Pulizia
#!/bin/bash
# cleanup-db.sh - Esegui con cautela!
echo "=== BACKUP ==="
wp db export backup-$(date +%Y%m%d).sql
echo "=== PRIMA ==="
wp db size --human-readable
echo "=== PULIZIA REVISIONI ==="
wp post delete $(wp post list --post_type=revision --format=ids) --force 2>/dev/null
echo "=== PULIZIA TRANSIENTS ==="
wp transient delete --all
echo "=== PULIZIA POSTMETA ORFANI ==="
wp db query "DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT ID FROM wp_posts)"
echo "=== PULIZIA AUTO-DRAFT ==="
wp post delete $(wp post list --post_status=auto-draft --format=ids) --force 2>/dev/null
echo "=== PULIZIA TRASH ==="
wp post delete $(wp post list --post_status=trash --format=ids) --force 2>/dev/null
echo "=== OTTIMIZZAZIONE ==="
wp db optimize
echo "=== DOPO ==="
wp db size --human-readable
Manutenzione Automatica
# Cron settimanale per pulizia automatica
# Aggiungi in crontab -e
0 3 * * 0 cd /var/www/site && wp transient delete --expired && wp db optimize
Database ancora lento dopo la pulizia? Potrebbe servire un’analisi delle query slow o una migrazione a server con SSD/Redis. Contattaci per una consulenza.