Optimizar Base de Datos WordPress sin Plugins

Inicio » General » Optimizar Base de Datos WordPress sin Plugins

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:

  • Revisiones de posts: Guardaste un borrador, lo corregiste 10 veces, publicaste. WordPress guarda las 11 versiones.
  • Comentarios spam: Akismet los marca como spam, pero siguen en la base de datos.
  • Transients expirados: WordPress guarda cache temporal que nunca se limpia solo.
  • Opciones de autoload: Plugins que añaden datos a 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

  • Desactivar todos los autoload: Algunos son necesarios. Investiga primero.
  • Borrar posts o comentarios sin verificar: Usa WHERE específico.
  • Hacer esto en producción sin backups: Obvio, pero lo digo por experiencia.
  • Usar plugins de «optimización» indiscriminadamente: Muchos son marketing puro.
  • 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.

    Deja un comentario