Ottimizzazione Database WordPress: Guida Completa

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.