Consulta lenta para la tabla wp_options

6 nov 2012, 11:07:55
Vistas: 39.3K
Votos: 21

He estado monitoreando el registro de consultas lentas del sitio basado en WP (con el valor predeterminado de long_query_time establecido en 10), y he notado que la siguiente consulta se registra frecuentemente -

# User@Host: root[root] @ localhost []
# Query_time: 0  Lock_time: 0  Rows_sent: 394  Rows_examined: 458
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';

No entiendo cómo una tabla tan pequeña puede tomar tanto tiempo en ejecutarse. ¿Es esto solo un síntoma de algún otro problema? (Actualmente ejecutando Moodle, phpBB y WP en una VM dedicada).

1
Comentarios

Voto por cerrar esta pregunta porque se hizo hace 8 años. En las actualizaciones recientes de WP este problema se ha resuelto.

Prasad Ajinkya Prasad Ajinkya
18 nov 2020 14:15:31
Todas las respuestas a la pregunta 4
9
18

Actualización: La razón por la que la consulta se está registrando es porque no utiliza un índice. El tiempo de la consulta es 0, es decir, en realidad se ejecuta rápidamente. Puedes desactivar la opción "log-queries-not-using-indexes" si no deseas que estas consultas sean registradas.

La tabla wp_options no tiene un índice en autoload (ahora debería tenerlo, se agregó al esquema principal de WP el 15 de agosto de 2019), por lo que la consulta termina haciendo un escaneo completo de la tabla. En general, esa tabla no debería crecer demasiado, por lo que no es un problema, pero supongo que en tu caso ha sucedido de alguna manera.

Agregar un índice podría resolver el problema, pero como señaló TheDeadMedic en los comentarios, podría no hacerlo si los valores de autoload son mayoritariamente "yes" o están distribuidos equitativamente entre "yes" y "no":

Primero, ejecuta esta consulta para ver cómo es la distribución:

SELECT COUNT(*), autoload FROM wp_options GROUP BY autoload;

Si una gran mayoría están configurados como 'no', puedes resolver el problema por ahora agregando un índice en autoload.

ALTER TABLE wp_options ADD INDEX (`autoload`);

Sin embargo, quizás quieras averiguar por qué esa tabla ha crecido demasiado. Posiblemente algún plugin mal escrito esté haciendo algo sospechoso.

6 nov 2012 16:39:56
Comentarios

Dudo que un índice en este caso ofrezca alguna mejora - revisa este artículo sobre cardinalidad.

TheDeadMedic TheDeadMedic
6 nov 2012 16:50:39

Depende de si la mayoría de opciones están configuradas para autoload o no. Supongo que no, pero en cualquier caso la tabla no debería crecer tanto, así que algo raro está pasando.

Vinay Pai Vinay Pai
6 nov 2012 17:05:27

Actualicé mi respuesta para agregar algo sobre verificar la distribución de valores.

Vinay Pai Vinay Pai
6 nov 2012 17:14:01

El índice no reducirá específicamente el tiempo de ejecución, pero evitará el escaneo completo de la tabla y los bloques asociados.

Steve Steve
6 nov 2012 17:45:28

Acabo de notar el comentario y me di cuenta de que mi respuesta es completamente incorrecta. La consulta en realidad no es lenta... solo se registra en el registro de consultas lentas porque no utiliza un índice.

Vinay Pai Vinay Pai
6 nov 2012 19:00:16

458 filas en wp_options no es particularmente grande en absoluto.

Steve Steve
6 nov 2012 19:10:14

Gracias a esta pregunta y respuesta descubrí que tenía 90k entradas en mi tabla wp_options, 88.5k de las cuales estaban configuradas como autoload false. El resto eran entradas "transient" añadidas por plugins (¿presumiblemente para caché?). Añadir un índice a la columna autoload redujo mi carga de mySql de un promedio del 89% al 2.5% instantáneamente. Los agentes de monitoreo muestran que el tiempo de respuesta de mi sitio bajó de 1900ms a 500ms. Esto fue un cambio radical para mí.

Mordred Mordred
25 mar 2017 05:41:25

El plugin woocommerce añade transient_external_ip_address y transient_timeout_external_ip_address en wp_options ya que almacenan la IP de los visitantes para propósitos de geolocalización (no sé por qué). Lo peor es que el plugin no elimina las entradas después del timeout, así que terminas con miles de datos inútiles...

fat_mike fat_mike
24 jul 2017 07:32:56

Esta es una publicación antigua, 7 años después finalmente añadieron algunos índices en la tabla wp_options el 15 de agosto de 2019. Ver: https://github.com/WordPress/WordPress/commit/716958625410ff83a3ae4ff46bb74b2eebcf41a5#diff-c7abc93dc5e86d04912fe01fc19c5e12

Mike Kormendy Mike Kormendy
2 may 2020 18:31:06
Mostrar los 4 comentarios restantes
0

Hace unos días me encontré con la consulta mencionada en mytop que se ejecutaba en mi servidor, ¡y en realidad tomaba bastante tiempo (alrededor de 10 segundos) para cada consulta! Así que hay situaciones reales donde wp_options puede crecer hasta un tamaño problemático. En mi caso, sospecho que el plugin de caché Cachify es el responsable del aumento desmedido de wp_options.

Datos de esta tabla wp_options en particular:

5,309 filas
130MB de datos

Como solución, añadí el índice similar a la solución publicada por Vinay Pai, lo cual resolvió el problema perfectamente.

27 mar 2013 20:19:42
1

Mi tabla wp_options solo tenía alrededor de 235 filas de datos. Intenté indexar la tabla, pero no ayudó.

Resulta que alrededor de 150 opciones transitorias habían sido insertadas en la tabla, pero no habían sido eliminadas automáticamente.

No sé si está relacionado o no, pero había estado revisando mis archivos /var/log/apache2/access.log y noté que múltiples servidores (presumiblemente comprometidos) de Amazon Web Services (direcciones IP que comienzan con 54.X.X.X y 32.X.X.X) habían estado intentando explotar /~directorio-raiz-web/xmlrpc.php.

Después de algunos problemas, consulté la tabla wp_options para nombres de opción que contuvieran "transient"

select * from wp_options where option_name like '%transient%';

Uno de los campos devueltos por esta consulta es 'option_value' que tiene un tipo de dato LONGTEXT. Según la documentación de mySQL, un campo LONGTEXT (para cada fila) puede contener hasta 4-Gigabytes de datos.

Cuando ejecuté la consulta, algunas de las filas (recuerda que estamos trabajando con aquellas que contienen "transient") tenían cantidades enormes de datos en el campo option_value. Al revisar los resultados, también vi lo que parecían intentos de inyectar comandos en el proceso wp-cron con la esperanza de que fueran ejecutados durante los ciclos cron.

Mi solución fue eliminar todas las filas "transient". Esto no dañará el servidor ya que las filas "transient" se repoblarán automáticamente (si se supone que deben estar allí).

Después de hacer esto, el servidor volvió a ser responsivo.

Consulta para eliminar estas filas:

DELETE from wp_options where option_name like '%transient%';

También he añadido los superbloques /8 de direcciones IP de AWS a mi firewall (-:

7 sept 2017 04:55:15
Comentarios

Sí. Yo también sufría de "tiempos de carga de 40 segundos" hasta que descubrí que tenía 20,000 registros en wp_option con datos enormes que se cargaban en cada página. Eliminar esos registros aceleró considerablemente el sitio.

JasonGenX JasonGenX
12 feb 2019 19:34:29
0

Actualización relacionada con el índice para el campo autoload en la tabla wp_options:

Se ha añadido un índice a wp_options.autoload en WordPress 5.3. Consulta el Registro de cambios de WordPress 5.3

Incluso puedes ver que el índice está disponible para otras columnas en la tabla wp_options también:

SHOW INDEX from wp_options
19 ago 2020 10:47:36