¿Cómo es que la tabla `wp_options` no tiene un índice en` autoload`?

15

Al comienzo de cada página servida por WordPress, hay una llamada de MySQL para buscar opciones:

SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';

Debido a que no hay índice en la autoloadcolumna, MySQL tiene que buscar TODAS las filas.

También me encontré con el comentario de esta respuesta diciendo que no habría ganancia de rendimiento incluso si hubiera un índice.

En mi solicitud, utilicé muchos valores transitorios para servir como reemplazo de sesión. Funcionaron muy bien y tengo mis propias rutinas de recolección de basura. Noté que en la wp_optionstabla, todos mis valores transitorios (los que comienzan con _transient_) tienen autoload=no. Espero que el número de filas de mi wp_optionstabla aumente a medida que aumenta el número de usuarios simultáneos.

Me gustaría saber por qué la mesa está diseñada de esta manera. ¿Y debo crear un índice para mi caso particular?

El shiming
fuente

Respuestas:

11

No hay índice porque su necesidad nunca fue lo suficientemente fuerte.

En el boleto n. ° 14258 se sugirió, pero como la mayoría de las opciones se usan autoload=yespor defecto, el índice se ignorará de todos modos.

También está el boleto abierto # 24044 _Agregar índice a wp_options para ayudar / mejorar el rendimiento_ .

Creo que deberías crear un índice. Sobrevivirá a las actualizaciones. Es posible que no ayude a su rendimiento, pero podría agregar datos estadísticos reales a ese ticket.


Actualización noviembre 2019

El índice se ha agregado a WordPress 5.3. Finalmente. Consulte el ticket # 24044 mencionado anteriormente y las notas del desarrollador para el lanzamiento .

Tenga en cuenta que si tiene un índice existente con el mismo nombre, recibirá una advertencia durante la actualización.

Del conjunto de cambios :

La mayoría de los sitios no se verán afectados por este cambio, pero aquellos con una gran cantidad de filas wp_options, de las cuales solo una pequeña cantidad se ha autoloadestablecido, verán una mejora significativa en el rendimiento.
Los sitios con una gran cantidad de filas wp_options, con muchos de ellos autoloadconfigurados, desafortunadamente verán una penalización de rendimiento además de las consultas ya muy lentas que están ejecutando, pero esto debería ser la minoría de los casos.

fuxia
fuente
1
Por lo que puedo decir al leer el # 24044, las tablas antiguas de MyISAM obtendrían una regresión de rendimiento, las nuevas tablas de InnoDB se beneficiarían principalmente. Estoy convirtiendo todas mis tablas heredadas a InnoDB y estableciendo un índice en la autoloadcolumna.
lkraav
Después de tantos años, finalmente fue abordado por el equipo de WordPress. Se ha agregado un índice awp_options.autoload . Fuentes: make.wordpress.org/core/2019/10/15/… ... y ... core.trac.wordpress.org/ticket/24044#comment:87 ... Felicitaciones a @DanBUK que propuso esta función en 2013.
Jee
Gracias, @Jee, he actualizado la respuesta.
fuxia
5

Estoy ejecutando 3 blogs WP en una instancia grande de Debian Squeeze y estaba investigando por qué mysql estaba atascado en ese host con un uso de CPU del 200% y una carga del sistema entre 3 y 6. Mirando una 'lista de procesos de show' dentro de mysql, entendimos el La tabla wp_option estuvo involucrada en este problema, así que ejecutamos:

alter table wp_options add index autoload_idx(`autoload`);

Después de esta operación, la carga mysql como se muestra en la parte superior cayó drásticamente al 1% y el promedio de carga de la instancia ahora es 0.10.

Estamos utilizando algunos complementos, por lo que podría haber un bucle en algún lugar del código, y esta podría ser una situación particular, pero en nuestro caso el cambio en el rendimiento es completamente sorprendente.

Nuestra tabla wp_options tiene 347 filas.

Fabio Pedrazzoli
fuente
2
Gracias por compartir. Supuse que WordPress tenía un defecto en el manejo de esta tabla de opciones. Es tan pequeño que no debería estar consultando. Debería ser de select *una vez por todas. En cambio, está consultando cada opción, por eso poner un índice hará una gran diferencia.
Él Shiming
0

Si bien @fuxia aceptó detalles de respuesta sobre algunas razones "reclamadas" (la mayoría de las cuales fueron reclamadas por empleados de Automattic en varios tickets de Trac, etc.), la razón subyacente para que WordPress Core no incluya un índice para las opciones de carga automática dentro de la wp_optionstabla es que Automattic se preocupó porque afectaría negativamente el rendimiento de las bases de datos MySQL que todavía usaban el motor MyISAM.

Específicamente, señalaron que el sitio web de WordPress.org era una base de datos muy antigua / compleja, como un sitio web de ejemplo cuyo rendimiento se vería afectado por dicho índice.

Casi todas las otras razones para no agregar el índice durante los últimos 9 años (sí, desde 2010 en el caso del boleto Trac # 14258 y desde 2013 en el caso del boleto Trac # 24044 ) fueron repetidamente probadas incorrectas por docenas de miembros del Comunidad de WordPress, sin embargo, los empleados de Automattic involucrados repetidamente ignoraron varias pruebas de referencia independientes y volvieron a mencionar las preocupaciones de MyISAM.

Afortunadamente, a fines de 2019 con PHP 7.2 ahora la versión "predeterminada" recomendada por WordPress Core, y con el motor InnoDB ahora predeterminado en versiones de MySQL después de 5.5 , y con la presión continua de varios desarrolladores, incluido @DanBUK, que se mantuvo en el tema durante años , Automattic finalmente cedió y decidió agregar el índice de carga automática a partir de WordPress 5.3+ en noviembre de 2019.

Nosotros en LittleBizzy habíamos lanzado el primer complemento conocido que agregaba automáticamente el índice si no existía, que todavía está disponible en GitHub y se descarga regularmente. Tenga en cuenta que ya NO necesita instalar dichos complementos en su pila de WordPress si está ejecutando WP Core 5.3 + ...

jessuppi
fuente