Acelera WordPress añadiendo un índice a wp_options (guía práctica con SQL y WP-CLI)

La tabla wp_options suele “engordar” con datos de temas y plugins (opciones, transients, sesiones, etc.). Si tu wp-admin va lento o ves consultas repetidas a wp_options, hay dos palancas claras:

  • Object cache (Redis/Memcached): saca lecturas a RAM.
  • Índice en MySQL: acelera búsquedas dentro de wp_options.

Aquí tienes una guía paso a paso para comprobar, decidir si conviene, crear el índice compuesto recomendado y medir el impacto. Incluyo equivalentes con WP-CLI y rollback seguro.


0) Antes de tocar nada

  • Backup de base de datos (dump) y, si puedes, snapshot.
  • Ventana de mantenimiento si tu instancia tiene mucho tráfico.
  • Versión de MySQL/InnoDB: en MySQL ≥5.7 puedes hacer DDL “online” con menos bloqueo (ver apartado 5).

1) ¿Ya existe un índice útil en wp_options?

WordPress trae por defecto:

  • PRIMARY KEY en option_id
  • UNIQUE KEY en option_name

Lo que no trae es un índice por autoload, útil para consultas del tipo:

SELECT option_name, option_value
FROM wp_options
WHERE autoload = 'yes';
Lenguaje del código: JavaScript (javascript)

Ver índices actuales (SQL)

SHOW INDEX FROM wp_options;

Con WP-CLI (respeta tu prefijo dinámicamente)

wp db query "SHOW INDEX FROM $(wp db prefix)options;"
Lenguaje del código: JavaScript (javascript)

Si ves un índice adicional con Column_name = autoload (o un compuesto autoload, option_name) ya lo tienes. Si no, sigue.

Atajo para listar solo “no estándar”:

SHOW INDEX FROM wp_options
WHERE column_name NOT IN ('option_id','option_name');
Lenguaje del código: JavaScript (javascript)
wp db query "SHOW INDEX FROM $(wp db prefix)options WHERE column_name NOT IN ('option_id','option_name');"
Lenguaje del código: JavaScript (javascript)

2) ¿Tiene sentido añadir el índice? (regla práctica)

El índice autoload, option_name aporta más cuando la mayoría de filas NO se autoloadan (es decir, autoload='no' es muy superior a autoload='yes'). Como regla de pulgar: si 60–80 % o más de las filas son autoload='no', el índice suele merecer la pena.

Cuenta filas autoload “sí” y “no”

-- autoload = 'yes'
SELECT COUNT(*) AS AutoloadYes
FROM wp_options
WHERE autoload = 'yes';

-- autoload = 'no'
SELECT COUNT(*) AS AutoloadNo
FROM wp_options
WHERE autoload = 'no';
Lenguaje del código: PHP (php)

WP-CLI:

wp db query "SELECT COUNT(*) AS AutoloadYes FROM $(wp db prefix)options WHERE autoload='yes';"
wp db query "SELECT COUNT(*) AS AutoloadNo  FROM $(wp db prefix)options WHERE autoload='no';"
Lenguaje del código: JavaScript (javascript)

Nota: las búsquedas por option_name = 'algo' ya usan el índice único de option_name. El índice que añadimos está orientado a cargar autoload y a ciertos barridos por autoload.


3) Crea el índice compuesto recomendado

Opción rápida (CREATE INDEX):

CREATE INDEX autoloadindex
ON wp_options (autoload, option_name);

WP-CLI:

wp db query "CREATE INDEX autoloadindex ON $(wp db prefix)options (autoload, option_name);"
Lenguaje del código: JavaScript (javascript)

Opción con DDL “online” (menos bloqueo) usando ALTER TABLE:
(soportado en InnoDB MySQL ≥ 5.7 / 8.0; MariaDB tiene matices)

ALTER TABLE wp_options
  ADD INDEX autoloadindex (autoload, option_name),
  ALGORITHM=INPLACE, LOCK=NONE;

WP-CLI:

wp db query "ALTER TABLE $(wp db prefix)options ADD INDEX autoloadindex (autoload, option_name), ALGORITHM=INPLACE, LOCK=NONE;"
Lenguaje del código: JavaScript (javascript)

Por qué compuesto: consultas por autoload='yes' obtienen búsqueda selectiva, y si además el motor necesita ordenar/filtrar por option_name, el compuesto ayuda a evitar filesorts.


4) Verifica que se usa el índice (EXPLAIN)

Comprueba el plan de ejecución antes y después del cambio:

EXPLAIN SELECT option_name, option_value
FROM wp_options
WHERE autoload='yes';
Lenguaje del código: JavaScript (javascript)

En MySQL 8.0 puedes usar:

EXPLAIN ANALYZE SELECT ...;

Deberías ver key: autoloadindex y type: ref (o similar), con menos filas examinadas.


5) Consideraciones de bloqueo / tiempo de creación

  • Tablas grandes: crear un índice puede ser costoso. Usa la variante ALTER TABLE ... ALGORITHM=INPLACE, LOCK=NONE para minimizar bloqueos (si tu versión lo soporta).
  • Espacio: un índice adicional consume almacenamiento (normalmente asumible).
  • Warm-up: tras crear el índice, los primeros accesos pueden calentar el buffer pool.

6) Mide la mejora

  • New Relic / APM: mira la transacción lenta que consultaba wp_options.
  • Slow Query Log: compara tiempos y “rows examined”.
  • Query Monitor (plugin): vigila consultas en admin y front.

Si tu cuello de botella era wp_options, deberías notar:

  • Menos tiempo en cargar autoloads.
  • wp-admin más ágil, sobre todo en sitios con muchos transients/opciones.

7) ¿Quieres revertir? (DROP INDEX)

DROP INDEX autoloadindex ON wp_options;

WP-CLI:

wp db query "DROP INDEX autoloadindex ON $(wp db prefix)options;"
Lenguaje del código: JavaScript (javascript)

8) Complementa con Object Cache (Redis/Memcached)

El índice acelera el acceso en disco, pero si puedes, añade object cache persistente:

  • WordPress consultará valores desde RAM (Redis/Memcached) y aliviará aún más tu BD.
  • En sitios de mucho tráfico o WooCommerce, índice + object cache es el combo ideal.

9) Checklist rápido (para producción)

  • Backup DB y ventana de mantenimiento.
  • Contar autoload yes/no y decidir.
  • Crear índice online (ALTER … LOCK=NONE) si es posible.
  • Verificar con EXPLAIN que el índice se usa.
  • Medir antes/después (APM/slow log).
  • Valorar Redis/Memcached como siguiente paso.

Snippets listos para pegar

Comprobar índices “no estándar”:

wp db query "SHOW INDEX FROM $(wp db prefix)options WHERE column_name NOT IN ('option_id','option_name');"
Lenguaje del código: JavaScript (javascript)

Contar autoload sí/no:

wp db query "SELECT COUNT(*) AS AutoloadYes FROM $(wp db prefix)options WHERE autoload='yes';"
wp db query "SELECT COUNT(*) AS AutoloadNo  FROM $(wp db prefix)options WHERE autoload='no';"
Lenguaje del código: JavaScript (javascript)

Crear índice compuesto (rápido):

wp db query "CREATE INDEX autoloadindex ON $(wp db prefix)options (autoload, option_name);"
Lenguaje del código: JavaScript (javascript)

Crear índice con menos bloqueo (si compatible):

wp db query "ALTER TABLE $(wp db prefix)options ADD INDEX autoloadindex (autoload, option_name), ALGORITHM=INPLACE, LOCK=NONE;"
Lenguaje del código: JavaScript (javascript)

Ver plan (EXPLAIN):

wp db query "EXPLAIN SELECT option_name, option_value FROM $(wp db prefix)options WHERE autoload='yes';"
Lenguaje del código: JavaScript (javascript)

Eliminar índice (rollback):

wp db query "DROP INDEX autoloadindex ON $(wp db prefix)options;"
Lenguaje del código: JavaScript (javascript)

Notas finales

  • El índice único de option_name ya cubre consultas por una opción concreta; el índice compuesto no lo sustituye, lo complementa para cargas por autoload.
  • No indexes option_value (suele ser LONGTEXT): no aporta en estos escenarios y encarece la tabla.
  • Si tu hosting ofrece MariaDB, el comportamiento de DDL online puede variar: revisa su manual para LOCK=NONE.

Con esto tendrás un camino sólido para acelerar wp_options y, por extensión, agilizar el dashboard y ciertas cargas del front.

Editor WPDirecto

Editor de WPDirecto potenciado con IA con el apoyo del equipo de edición.

Te puede interesar...

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    WordPress Directo
    WPDirecto.com es una revista especializada en WordPress y WooCommerce que ofrece una amplia gama de recursos, incluyendo tutoriales, análisis de plugins y plantillas, consejos de optimización y estrategias de SEO, para ayudar a los usuarios a mejorar y personalizar sus sitios web, manteniéndolos informados sobre las últimas novedades y tendencias en el mundo de WordPress.

    © 1995-2025 Color Vivo Internet, SLU (Medios y Redes Online).. Otros contenidos se cita fuente. Infraestructura cloud servidores dedicados de Stackscale.