¿Por qué las actualizaciones simples de "_edit_lock" de wp_postmeta son tan lentas?

11

En nuestro registro de consultas lentas de MySQL, la consulta más lenta acumulativa es una simple actualización de wp_postmeta. Aquí hay un ejemplo:

UPDATE `wp_postmeta`
  SET `meta_value` = '1392835505:386'
  WHERE `post_id` = 94705 AND `meta_key` = '_edit_lock';

Detalles relevantes sobre nuestra configuración:

  • MySQL tiempo de consulta lento establecido en 1s
  • El motor de almacenamiento de wp_postmeta es InnoDB
  • Se ejecuta dentro de una gran instalación multisitio con decenas de miles de publicaciones en el blog principal de WP (donde se producen estas consultas lentas)
  • Alta actividad en el área de administración de WP (muchos escritores / editores que trabajan simultáneamente, pero generalmente en su propio contenido (no el de otros))
  • Baja actividad en el lado público de WP (en realidad no se publica contenido del blog principal)
  • Las consultas lentas parecen estar usando la tecla "_edit_lock"; Las consultas del mismo formato (que usan una clave distinta de "_edit_lock") no parecen ser lentas.

¿Por qué es esta la consulta más lenta en nuestro sistema? ¿Tiene algo que ver con el uso específico de WP de "bloqueos de edición"?

¡Gracias! :)


Actualización: Salida de mysqlsla a continuación:

______________________________________________________________________ 001 ___
Count         : 606  (16.83%)
Time          : 2257.760468 s total, 3.725677 s avg, 1.00512 s to 84.645869 s max  (20.60%)
  95% of Time : 1355.289277 s total, 2.357025 s avg, 1.00512 s to 12.343604 s max
Lock Time (s) : 182.502 ms total, 301 μs avg, 29 μs to 157.542 ms max  (0.21%)
  95% of Lock : 22.882 ms total, 40 μs avg, 29 μs to 57 μs max
Rows sent     : 0 avg, 0 to 0 max  (0.00%)
Rows examined : 1 avg, 1 to 2 max  (0.00%)
Database      : xxx_wp
Users         :
        xxx_wp@localhost  : 98.84% (599) of query, 51.03% (1837) of all users
        yyy_wp@localhost  : 1.16% (7) of query, 0.94% (34) of all users

Query abstract:
SET timestamp=N; UPDATE wp_postmeta SET meta_value = 'S' WHERE post_id = N AND meta_key = 'S';

Query sample:
SET timestamp=1392835506;
UPDATE `wp_postmeta` SET `meta_value` = '1392835505:386' WHERE `post_id` = 94705 AND `meta_key` = '_edit_lock';
rinogo
fuente
¿Para cuántos resultados obtienes SELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'? ?
adrian7
Gracias por tu pregunta, adrian7! Hay 33k filas que coinciden con su consulta. No estoy familiarizado con el uso de WP de la metaclave '_edit_lock'. ¿Es esto anormal?
rinogo
no es anormal, wordpress lo usa para alertar a los usuarios cuando intentan editar la misma publicación / página. Le sugiero que elimine todos los _edit_locks de wp_postmeta, obviamente cuando no haya nadie editando y verifique después de cualquier mejora en el rendimiento. (Por cierto, haga una copia de seguridad primero).
adrian7
3
¿También toma una gran cantidad de tiempo cuando solo haces SELECTesta entrada? Como SELECT * FROM wp_postmeta` WHERE post_id= 94705 AND meta_key= '_edit_lock'; `?
fischi
@fischi: Esa consulta parece tomar de 45 a 50 ms, al menos en las pruebas que hice hace unos momentos. Sin embargo, es posible que ocasionalmente tarde mucho tiempo (por ejemplo, hasta 84 segundos, como se muestra en la salida de mysqlsla incluida en la pregunta). Ejecutaré una nueva ronda de análisis de consultas lentas para ver si alguno de mis cambios recientes en nuestra configuración ha afectado las consultas.
rinogo

Respuestas:

3

_edit_lock se genera cada vez que edita una publicación o página. Consiste en el código de tiempo y el usuario. para que WordPress sepa quién lo está editando actualmente.

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

si lo manipulas WordPress reacciona de alguna manera sensible ... Traté de recuperar la cantidad de segundos que alguien trabajó en una publicación. Todo el tiempo rompió el tiempo de carga de mi base de datos.

Como dijiste, estás ejecutando esto en un gran multisitio. No sé cuántos usuarios escriben publicaciones allí, pero definitivamente podría romper la RAM del servidor si muchas personas editan una publicación al mismo tiempo.

Una solución podría ser: deshacerse de _edit_lock

¿Cómo deshabilitar el "Bloqueo posterior / Editar bloqueo"?

Normalmente WordPress debería tener el "_edit_lock" uno por Post. Algunas bases de datos tienen el problema de generarlas cada vez.

Al igual que este tipo http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta

Su solución fue eliminarlos a todos. Para acelerarlo, puede eliminarlos todas las noches a las 3 en punto en phpMyAdmin con

DELETE FROM `yourdb`.`wp_postmeta` WHERE `wp_postmeta`.`meta_key` = '_edit_lock'

podría ser que encuentres un trabajo cron haciendo exactamente eso.

seot
fuente
0

prueba esto :)

UPDATE `wp_postmeta` 
    SET `meta_value` = concat(unix_timestamp(),':386')  
    WHERE `post_id`  = 94705 
      AND `meta_key` = '_edit_lock';
demopix
fuente