Optimizar Base de Datos WordPress sin Plugins
Una base de datos limpia es la diferencia entre un sitio que responde en 200ms y uno que tarda 3 segundos. Lo más interesante: no necesitas plugins para mantenerla optimizada.
He gestionado bases de datos WordPress de sitios con 100k+ visitas mensuales, y siempre que toco un sitio lento, el problema es el mismo: tablas infladas con basura acumulada durante años.
Por qué tu base de datos está lenta
Cada vez que alguien visita tu sitio, WordPress hace múltiples consultas a la base de datos. Si tus tablas tienen 50.000 filas cuando deberían tener 5.000, cada consulta tarda más. No es linear: el doble de datos no significa el doble de tiempo, puede significar 10x más tiempo si los índices están fragmentados.
Las causas más comunes que he visto:
wp_options que se cargan en cada petición.Lo que necesitas antes de empezar
AVISO: Vas a tocar la base de datos de tu sitio. Haz esto primero:
1. Backup completo de la base de datos
2. Backup de archivos
3. Si es un sitio en producción, hazlo en horario de poco tráfico
Necesitas acceso a phpMyAdmin o acceso SSH para usar MySQL directamente. Si tu hosting no te da acceso SSH, considera cambiar de hosting.
Paso 1: Limpiar revisiones de posts
Las revisiones ocupan espacio real. Un post con 15 revisiones = 15 veces el mismo contenido en tu base de datos.
En phpMyAdmin:
`sql
— Ver cuántas revisiones tienes
SELECT COUNT(*) FROM wp_posts WHERE post_type = ‘revision’;
— Borrar revisiones (ANTES haz backup)
DELETE FROM wp_posts WHERE post_type = ‘revision’;
DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT id FROM wp_posts);
`
Por SSH:
`bash
mysql -u usuario -p base_datos -e «DELETE FROM wp_posts WHERE post_type = ‘revision’;»
mysql -u usuario -p base_datos -e «DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT id FROM wp_posts);»
`
He visto sitios donde esto libera 500MB-1GB de espacio. La primera vez que lo hice en un cliente con 5 años de contenido, pasamos de 2.5GB a 800MB.
Paso 2: Limpiar comentarios spam
Akismet es genial, pero no limpia: solo marca.
`sql
— Ver cuántos comentarios spam tienes
SELECT COUNT(*) FROM wp_comments WHERE comment_approved = ‘spam’;
— Borrar spam
DELETE FROM wp_comments WHERE comment_approved = ‘spam’;
DELETE FROM wp_commentmeta WHERE comment_id NOT IN (SELECT comment_ID FROM wp_comments);
`
También puedes limpiar comentarios de la papelera:
`sql
DELETE FROM wp_comments WHERE comment_approved = ‘trash’;
`
Paso 3: Limpiar transients expirados
Los transients son datos temporales que WordPress usa para cache. El problema: expiran pero no se borran.
`sql
— Ver cuántos transients tienes
SELECT COUNT(*) FROM wp_options WHERE option_name LIKE ‘_transient_%’;
— Borrar transients expirados
DELETE FROM wp_options WHERE option_name LIKE ‘_transient_timeout_%’;
DELETE FROM wp_options WHERE option_name LIKE ‘_transient_%’ AND option_name NOT LIKE ‘_transient_timeout_%’;
`
Paso 4: Reducir el tamaño de wp_options
Esta es la causa #1 de sitios lentos que he visto. Plugins mal programados añaden datos a wp_options con autoload=yes, lo que significa que se cargan en cada petición.
`sql
— Ver opciones con autoload más grandes
SELECT option_name, LENGTH(option_value) as size
FROM wp_options
WHERE autoload = ‘yes’
ORDER BY size DESC
LIMIT 20;
— Si ves algo sospechoso (ej: un plugin que ya no usas)
UPDATE wp_options SET autoload = ‘no’ WHERE option_name = ‘nombre_opcion’;
`
Cuidado con esto. No cambies autoload si no sabes qué hace esa opción.
Paso 5: Optimizar tablas (fragmentación)
Con el tiempo, las tablas se fragmentan. OPTIMIZE TABLE reorganiza los datos.
`sql
OPTIMIZE TABLE wp_posts;
OPTIMIZE TABLE wp_postmeta;
OPTIMIZE TABLE wp_options;
OPTIMIZE TABLE wp_comments;
OPTIMIZE TABLE wp_commentmeta;
`
Puedes optimizar todas las tablas de una vez:
`sql
— Optimizar todas las tablas de la base de datos
SELECT CONCAT(‘OPTIMIZE TABLE ‘, table_name, ‘;’) FROM information_schema.tables WHERE table_schema = ‘nombre_base_datos’;
`
Paso 6: Limitar revisiones futuras
Para no tener que hacer esto cada mes, limita las revisiones que WordPress guarda.
Añade a wp-config.php:
`php
// Limitar a 3 revisiones por post
define(‘WP_POST_REVISIONS’, 3);
// O desactivar revisiones completamente
// define(‘WP_POST_REVISIONS’, false);
`
También desactiva autosaves constantes:
`php
// Autosave cada 300 segundos (5 minutos) en lugar de 60
define(‘AUTOSAVE_INTERVAL’, 300);
`
Automatizar: Script mensual
Crea un script PHP en wp-content/maintenance.php:
`php
// Script de mantenimiento mensual
// Ejecutar via cron: php maintenance.php
require_once(‘wp-config.php’);
global $wpdb;
// 1. Limpiar revisiones (mantener últimas 5)
$wpdb->query(«
DELETE FROM {$wpdb->posts}
WHERE post_type = ‘revision’
AND ID NOT IN (
SELECT ID FROM (
SELECT ID FROM {$wpdb->posts}
WHERE post_type = ‘revision’
ORDER BY post_date DESC
LIMIT 5
) AS tmp
)
«);
// 2. Limpiar spam más viejo que 30 días
$wpdb->query(«
DELETE FROM {$wpdb->comments}
WHERE comment_approved = ‘spam’
AND comment_date
«);
// 3. Limpiar transients expirados
$wpdb->query(«
DELETE FROM {$wpdb->options}
WHERE option_name LIKE ‘_transient_timeout_%’
AND option_value
«);
// 4. Optimizar tablas principales
$tables = [$wpdb->posts, $wpdb->postmeta, $wpdb->options, $wpdb->comments, $wpdb->commentmeta];
foreach ($tables as $table) {
$wpdb->query(«OPTIMIZE TABLE {$table}»);
}
echo «Mantenimiento completado: » . date(‘Y-m-d H:i:s’);
`
Añade al crontab de tu servidor:
`bash
Ejecutar el primer día de cada mes a las 3 AM
0 3 1 php /ruta/a/wp-content/maintenance.php
`
Cuánto puedes mejorar
Antes de cualquier optimización, mide:
`sql
— Tamaño total de la base de datos
SELECT
table_schema AS ‘Base de datos’,
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS ‘Tamaño (MB)’
FROM information_schema.tables
WHERE table_schema = ‘nombre_base_datos’;
`
Después de optimizar, mide de nuevo. He mejorado sitios de esta forma:
| Sitio | Antes | Después | Mejora |
| ——- | ——- | ——— | ——– |
| Blog 5 años | 2.1 GB | 650 MB | -69% |
| E-commerce | 850 MB | 320 MB | -62% |
| Noticias | 1.2 GB | 480 MB | -60% |
En tiempo de carga: de 3.2s a 1.1s en uno de los casos.
Lo que NO debes hacer
WHERE específico.Alternativa: Query Monitor
Antes de tocar nada, instala Query Monitor. Te muestra exactamente qué consultas lentas están pasando. A veces el problema no es la base de datos, sino un plugin mal programado haciendo 50 consultas en cada página.
Query Monitor → Database Queries → Slow Queries
Si ves un plugin específico causando problemas, considera desactivarlo antes de tocar la base de datos.
Mantener limpio con el tiempo
Después de la limpieza inicial, un mantenimiento mensual es suficiente:
1. Revisar y borrar spam
2. Limpiar transients
3. Optimizar tablas
4. Revisar tamaño de wp_options
Si tu sitio tiene mucho tráfico nuevo (comentarios, posts), hazlo cada 2 semanas. Si es un sitio estable, mensual está bien.
La base de datos es el corazón de WordPress. Mantenerla limpia no es algo que hagas una vez y olvides: es mantenimiento regular, como cambiar el aceite del coche.
La diferencia: un coche con aceite viejo sigue funcionando. Una base de datos WordPress sucia puede hacer que tu sitio parezca caído cuando en realidad está ahí, solo que demasiado lento para responder.



