Rendimiento y monitorización

Optimizar la tabla wp_options y los datos de tipo "autoload"

Revisado el 10 min de lectura WordPress rendimiento base de datos

La tabla wp_options guarda la configuración de WordPress, de los plugins y del tema. Con los años acumula datos que nadie ve: restos de plugins desinstalados que no limpiaron al irse, tareas cron pendientes, transitorios caducados o datos de caché.

Su estructura es sencilla:

  • option_id: identificador.
  • option_name: nombre de la opción.
  • option_value: el dato guardado.
  • autoload: si la opción se carga en cada visita.

Las opciones con autoload activo se leen todas juntas al arrancar WordPress, en cada página que no salga de caché. Si entre ellas hay datos de gran tamaño, cada visita los lee de la base de datos y los carga en memoria. Es una causa muy habitual de lentitud y de consumo alto de recursos.

En las consultas de este artículo la tabla se llama wp_options. Si tu instalación usa otro prefijo (lo ves en $table_prefix del wp-config.php), cambia wp_ por el tuyo. Haz una copia de la base de datos antes de borrar o modificar filas.

Todas las consultas se ejecutan desde phpMyAdmin: selecciona la base de datos de WordPress y abre la pestaña SQL.

Medir el tamaño de los datos autoload

Ejecuta esta consulta:

SELECT COUNT(*) AS opciones,
       ROUND(SUM(LENGTH(option_value)) / 1024) AS kb
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto-on', 'auto');

Te devuelve el número de opciones autocargadas y cuántos KB ocupan. Desde WordPress 6.6 la columna autoload usa los valores on, off, auto, auto-on y auto-off además de los antiguos yes y no; la consulta tiene en cuenta todos los que se cargan.

Resultado de la consulta del tamaño total autoload en phpMyAdmin

Como referencia, Salud del sitio de WordPress avisa a partir de 800 KB. No es un límite exacto: hay webs que necesitan algo más y van bien, pero si estás por encima merece la pena seguir con los pasos siguientes.

Encontrar las opciones que más ocupan

Esta consulta muestra las 10 opciones autocargadas más grandes, en KB:

SELECT option_name,
       ROUND(LENGTH(option_value) / 1024) AS kb
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto-on', 'auto')
ORDER BY LENGTH(option_value) DESC
LIMIT 10;

Cambia LIMIT 10 si quieres ver más resultados.

Las opciones autoload que más ocupan en phpMyAdmin

Para ver qué guarda una opción concreta, búscala por su nombre. Por ejemplo, para revslider-addons:

SELECT *
FROM wp_options
WHERE option_name = 'revslider-addons';

Si no reconoces un nombre, búscalo en Google: casi siempre aparece el plugin que lo crea. Por ejemplo, icl_sitepress_settings es de WPML, y en los primeros resultados ya hay usuarios con el mismo problema de tamaño.

Búsqueda en Google del nombre de una opción para identificar su plugin

Con el nombre identificado, decide en cada caso:

  • Es de un plugin que ya no usas (eliminado o desactivado para siempre): borra la fila desde phpMyAdmin o con DELETE FROM wp_options WHERE option_name = 'nombre_opcion';.

  • Es de un plugin activo y ocupa demasiado: revisa sus ajustes (registros, estadísticas o caché que guarde en la base de datos) y consulta en su foro de soporte si ese tamaño es normal.

  • Es de un plugin activo pero no hace falta cargarla en cada visita: desactiva su autoload. Con WP-CLI:

    wp option set-autoload nombre_opcion off
    

    O desde phpMyAdmin (en WordPress anterior a 6.6 usa 'no' en lugar de 'off'):

    UPDATE wp_options SET autoload = 'off' WHERE option_name = 'nombre_opcion';
    

    La opción sigue existiendo y el plugin la leerá cuando la necesite. Hazlo opción a opción, nunca con todas a la vez. Si usas caché de objetos (Redis), vacíala después.

No edites a mano el contenido de option_value: muchas opciones son datos serializados y cambiar un carácter las rompe.

Revisar el tamaño total de la tabla

Aunque una opción no tenga autoload, una tabla wp_options enorme también penaliza. En phpMyAdmin, en la lista de tablas de la base de datos, ves de un vistazo las filas y el tamaño de wp_options:

Número de filas y tamaño de la tabla wp_options en phpMyAdmin

  • Muchas filas suelen indicar transitorios o sesiones acumulados (lo vemos más abajo).
  • Pocas filas pero mucho tamaño indica que unas pocas opciones ocupan demasiado. Localízalas con la consulta anterior sin filtrar por autoload:
SELECT option_name, autoload,
       ROUND(LENGTH(option_value) / 1024) AS kb
FROM wp_options
ORDER BY LENGTH(option_value) DESC
LIMIT 10;

El número de filas que muestra phpMyAdmin en tablas InnoDB es aproximado. Para el dato exacto usa SELECT COUNT(*) FROM wp_options;.

La opción «cron»

WordPress guarda todas sus tareas programadas pendientes en una sola fila llamada cron, que es autoload. Si aparece entre las más grandes, edítala en phpMyAdmin y mira qué tareas contiene: normalmente un plugin está programando tareas repetidas que no se ejecutan nunca.

Para verlas de forma legible, instala el plugin WP Crontrol (Herramientas > Eventos cron) o usa WP-CLI:

wp cron event list

Borra las tareas de plugins que ya no usas desde WP Crontrol o con wp cron event delete nombre_del_hook. No edites la fila cron a mano. El sistema de cron de WordPress tiene además un diseño problemático para el rendimiento: conviene sustituirlo por un cron real del servidor.

Datos transitorios

Los transitorios (transients) son datos temporales con fecha de caducidad. A veces no se purgan y se acumulan miles. Cuéntalos así:

SELECT COUNT(*)
FROM wp_options
WHERE option_name LIKE '\_transient\_%'
   OR option_name LIKE '\_site\_transient\_%';

Si salen miles, bórralos de forma segura (WordPress los vuelve a crear si los necesita). Con WP-CLI:

wp transient delete --expired

Y si quieres borrarlos todos, caducados o no:

wp transient delete --all

Si prefieres hacerlo desde el escritorio de WordPress, usa el plugin Transients Manager o Transient Cleaner. Si al poco tiempo vuelven a acumularse, busca qué plugin los genera por el nombre de los transitorios.

Sesiones guardadas en wp_options

Algunos plugins (por ejemplo WP Session Manager o versiones antiguas de Easy Digital Downloads) guardan sesiones de usuario en wp_options con el prefijo _wp_session_. Cuéntalas:

SELECT COUNT(*)
FROM wp_options
WHERE option_name LIKE '\_wp\_session\_%';

Depende del tipo de web (no es lo mismo un foro con miles de usuarios que un blog), pero más de 1000 filas suele indicar que no se purgan. Puedes borrarlas:

DELETE FROM wp_options
WHERE option_name LIKE '\_wp\_session\_%';

Los usuarios con la sesión abierta en ese momento tendrán que volver a identificarse, y si es una tienda pueden perder lo que tuvieran en el carrito. WooCommerce no usa estas filas: guarda sus sesiones en su propia tabla wp_woocommerce_sessions.

Índice sobre autoload

Un índice permite a MySQL encontrar las filas sin recorrer la tabla entera. Las versiones actuales de WordPress ya crean un índice sobre la columna autoload. Compruébalo:

SHOW INDEX FROM wp_options;

Si en la columna Column_name aparece autoload, no tienes que hacer nada. Si no aparece (instalaciones antiguas que no han actualizado su base de datos), créalo:

CREATE INDEX autoload ON wp_options(autoload);

Caché de objetos

Si ya has limpiado todo lo posible y la tabla sigue siendo grande, una caché de objetos evita repetir esas lecturas en cada visita. Tienes los detalles en qué es la caché de objetos y cómo configurarla en WordPress y en configurar Redis como caché de objetos.

También te puede ayudar

¿Algo no cuadra o ha cambiado? Cuéntanoslo y lo revisamos.