¿Por qué las actualizaciones simples de "_edit_lock" en wp_postmeta son tan lentas?
En nuestro registro de consultas lentas de MySQL, la consulta acumulativamente más lenta es una simple actualización a wp_postmeta. Aquí un ejemplo:
UPDATE `wp_postmeta`
SET `meta_value` = '1392835505:386'
WHERE `post_id` = 94705 AND `meta_key` = '_edit_lock';
Detalles relevantes de nuestra configuración:
- Tiempo de consulta lenta de MySQL configurado a 1s
- El motor de almacenamiento de wp_postmeta es InnoDB
- Ejecutándose en una instalación Multisite grande con decenas de miles de posts en el blog principal de WP (donde ocurren estas consultas lentas)
- Alta actividad en el área de administración de WP (muchos escritores/editores trabajando concurrentemente, pero generalmente en su propio contenido, no en el de otros)
- Baja actividad en la parte pública de WP (no se sirve contenido del blog principal)
- Las consultas lentas parecen usar siempre la clave "_edit_lock"; consultas del mismo formato (que usan una clave diferente a "_edit_lock") no parecen ser lentas.
¿Por qué esta es la consulta más lenta en nuestro sistema? ¿Tiene que ver con el uso específico que hace WP de los "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';

El _edit_lock se genera cada vez que editas una publicación o página. Consiste en una marca de tiempo y el usuario, así WordPress sabe 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 manera sensible... Intenté calcular cuántos segundos alguien trabajó en una publicación. Todo el tiempo rompió el tiempo de carga de mi base de datos.
Como dijiste que ejecutas esto en una red multisitio grande. No sé cuántos usuarios escriben publicaciones allí, pero definitivamente podría saturar la RAM del servidor si demasiadas personas editan una publicación al mismo tiempo.
Una solución podría ser: eliminar _edit_lock
Cómo deshabilitar el "Bloqueo de publicación/Bloqueo de edición"
Normalmente WordPress debería tener un "_edit_lock" por publicación. Algunas bases de datos tienen el problema de generarlos cada vez.
Como este caso http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta
Su solución fue eliminarlos todos. Para acelerarlo puedes eliminarlos todas las noches a las 3 en punto en phpMyAdmin con
DELETE FROM `yourdb`.`wp_postmeta` WHERE `wp_postmeta`.`meta_key` = '_edit_lock'
Quizás encuentres un trabajo cron que haga exactamente eso.
