Cómo añadir un índice en la tabla options de WordPress y por qué deberías hacerlo

La tabla options (wp_options por defecto, o idealmente con tu prefijo personalizado) de WordPress es la que va acumulando información sobre cada uno de los plugins, ajustes y configuraciones, y más cosas, que vas instalando a lo largo de la vida de tu web.

Si a esto le sumamos que la mayoría de los plugins no eliminan líneas de esta tabla, verás que poco a poco se va convirtiendo en un monstruo con miles de líneas, que WordPress comprueba y lanza en cada carga de página.

Como ya podrás imaginar, una tabla options grande puede ralentizar enormemente tu web, puesto que tu WordPress debe hacer multitud de peticiones y lanzamiento de solicitudes antes de cargar cada página para cada visitante.

Ergo, si pudiésemos limitar esta cantidad de solicitudes tu web cargaría más rápido, al tener que realizar menos consultas ¿no es así?

El culpable: Autoload

El culpable de todo esto es el campo Autoload de cada línea de la tabla options, normalmente con el valor en Yes, o sea, que sí, que se carga automáticamente mediante la función wp_load_alloptions().

¿Cuál es el problema de Autoload?

Pues muy simple, que carga automáticamente toda opción de la tabla options, aunque:

  • La opción del plugin no necesite cargarse en cada página (Ejemplo: formulario de contacto que carga sus ajustes en toda la web cuando solo está en una página).
  • El plugin ya no esté instalado y activo.
  • El tema ya no esté activo.
  • El plugin debería haber creado sus propias tablas y no meter sus opciones en la tabla options

Y, el verdadero problema es cuando se autocarga demasiado pero ¿qué es demasiado?

Nota importante: En este artículo vamos a trabajar directamente con la base de datos. Antes de ejecutar ninguna consulta o tocar algo en la misma haz una copia de seguridad.

Ejecuta este comando SQL, puedes hacerlo en PHPMyAdmin de tu panel del hosting:

SELECT SUM(LENGTH(option_value)) as autoload_size FROM mi_prefijo_options WHERE autoload='yes';

Nota: Cambia el prefijo del ejemplo por el tuyo, no te olvides.

Pulsa en el botón Continuar o ejecuta la consulta SQL y obtendrás el tamaño de la consulta de todos los valores con autoload e bytes. Y la regla debería ser:

  • Si el resultado del autoload_size es mayor de 1 Mb (aprox. 1.000.000 bytes) deberías hacer algo para optimizar esto.

En el ejemplo de la captura el tamaño es ridículo, así que si tus resultados son por el estilo ya acabaste de leer el artículo, dedica tu tiempo a bloguear algo.

Si obtuviste un resultado por encima de 1Mb, o simplemente quieres dedicar un rato a aprender algo más, sigue leyendo.

Dicho esto, ¿no sería mejor poder definir qué se carga y cuándo en nuestra instalación de WordPress?

Crea un índice en la tabla options

Hay varias maneras de adelgazar la tabla options, pero vamos a ver principalmente una que ha demostrado ser tremendamente eficaz y fácil de aplicar.

¿Por qué es la mejor solución?

La mejor solución a tablas options enormes que ralentizan tu web es crear un índice de la tabla options. En pruebas en sitios con muchas líneas con Autoload la diferencia entre cargar la tabla con y sin índice devuelven unos resultados fuera de toda duda.

Por si no sabes inglés: en rojo tiempo de carga Autoload sin índice, en azul con índice.

También puedes ver cómo se redujo el tiempo de carga en un sitio tras añadir un índice:

Las mejoras de rendimiento y velocidad son brutales, especialmente con bases de datos grandes, y lo mejor de todo es que crear un índice es muy sencillo.

Comprueba el índice

Una buena prueba a realizar antes de crear el índice es ver cuántas columnas (opciones) tienen Autoload en Yes, o sea, que se cargan. Se haría así:

SELECT COUNT(CASE WHEN autoload = 'yes' THEN 1 END) FROM mi_prefijo_options;

Para luego las que no se cargan, las que tengan Autoload en No.

SELECT COUNT(CASE WHEN autoload = 'no' THEN 1 END) FROM mi_prefijo_options;

Los resultados se verán así:

La regla a aplicar sería la siguiente:

  • Si los valores en No superan el 60% del total  entonces no necesitas un índice.

Crear un índice con comandos SQL

Si te sientes cómodo, puedes crear el índice ejecutando un comando así:

CREATE INDEX autoloadindex ON mi_prefijo_options(autoload, option_name);

De nuevo, puedes cambiar el nombre del índice, autoloadindex en el ejemplo, y debes cambiar el prefijo de la tabla options por el que tú uses.

Crear un índice con WP-CLI

Si prefieres usar la interfaz de comandos de WordPress WP-CLI, lo harías así:

wp db query "CREATE INDEX autoloadindex ON $(wp db prefix --allow-root --skip-plugins --skip-themes)options(autoload, option_name);" --allow-root

Crear un índice con plugins

En el caso de que no quieras o no te atrevas con SQL, también hay un plugin que te ayudará en esta tarea de la creación del índice.

Se llama Index Autoload y no tiene ni siquiera ajustes, lo activas y listo.

Eso sí, aunque sea un plugin, la regla de hacer copia de seguridad de la base de datos sigue vigente, no se te olvide.

Este plugin crea el índice del Autoload igualmente.

Ya no quiero el índice

Como no hay nada como la libertad de elección, si en algún momento ya no quieres el índice puedes ejecutar este comando para borrarlo:

DROP INDEX autoloadindex ON mi_prefijo_options

De nuevo, recuerda cambiar el nombre del índice y el prefijo de la tabla por los tuyos.

Si usaste la opción de hacerlo con el plugin al desactivarlo y borrarlo se borra también el índice.

¿De verdad merece la pena?

Aunque no hay nada mejor que hace una prueba, te daré algunos consejos:

  • Si las opciones en Autoload de tu tabla options pesan más de 1Mb merece la pena
  • Si el Autoload Yes supera el 60% merece la pena
  • Si tienes una tabla options grande merece la pena

El resultado es reducir las consultas de WordPress a la tabla options en más de un 90% en muchos casos, lo que redunda en mejores tiempos de carga en tu web.


Para aprender más

Aquí te dejo unos recursos para seguir aprendiendo sobre este asunto:

VALORA Y COMPARTE ESTE ARTÍCULO PARA MEJORAR LA CALIDAD DEL BLOG…
(13 votos, promedio: 5)

¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!

9 comentarios en “Cómo añadir un índice en la tabla options de WordPress y por qué deberías hacerlo”

  1. Hola Fernando! Estupenda entrada!! Gracias por compartir. Quería preguntarte si esto también lo podríamos aplicar a otras tablas, como por ejemplo, la POSTMETA o POSTS??

  2. Santiago Becerra Carrillo

    Creo que la regla «Si los valores en No superan el 60% del total entonces no necesitas un índice.» es incorrecta. Si se trata de encontrar los valores en «Yes» un índice no aporta nada si la mayoría de los valores son «Yes».

    En la entrada «Add MySQL Index to WordPress wp_options table» dice justo lo contrario:

    As a rule of thumb if 60-80% of the option_name keys are autoload = no values then an index is a good idea.

    Por otra parte, me ha llamado mucho la atención que el campo autoload sea un varchar(20) en vez de un boolean ¿Quién fue el animal al que se le ocurrió semejante burrada?

  3. Y si estás en medio de lo que comentas, Fernando? Es decir, claramente por encima en tamaño (casi 3Mb) pero luego muy por debajo de ese 60%? Seguiría siendo recomendable el índice?

  4. Como siempre, gracias!
    La verdad que cuando arrastras una base de datos de más de 10 años hay muchos restos de plugins que la verdad a veces no hay forma fiable de limpiar de la base de datos, con esto ahorraremos en llamadas a plugins que ya no estan como poco.

Deja un comentario

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

 

Ir arriba Ir al contenido