Почему простые обновления wp_postmeta "_edit_lock" выполняются так медленно?
В нашем логе медленных запросов MySQL, самый медленный запрос — это простое обновление в wp_postmeta. Вот пример:
UPDATE `wp_postmeta`
SET `meta_value` = '1392835505:386'
WHERE `post_id` = 94705 AND `meta_key` = '_edit_lock';
Детали нашей конфигурации:
- Время для медленных запросов MySQL установлено в 1 секунду
- Движок хранилища для wp_postmeta — InnoDB
- Работаем в большой Multisite-установке с десятками тысяч записей в основном блоге WordPress
- Высокая активность в админке WordPress
- Низкая активность на публичной стороне
- Медленные запросы используют только ключ "_edit_lock"
Почему этот запрос самый медленный? Это связано с блокировками редактирования в WordPress?
Обновление: Вывод из mysqlsla:
______________________________________________________________________ 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';

_edit_lock создается каждый раз при редактировании записи или страницы. Он содержит временную метку и идентификатор пользователя, чтобы WordPress знал, кто в данный момент редактирует контент.
meta_id post_id meta_key meta_value
9 5 _edit_lock 1388386997:1
Если пытаться манипулировать этими данными, WordPress может реагировать нестабильно... Я пробовал подсчитать, сколько секунд пользователь работал над записью, но это постоянно приводило к замедлению загрузки базы данных.
Как вы упомянули, у вас крупная мультисайтовая сеть. Не знаю, сколько пользователей одновременно публикуют материалы, но если многие будут редактировать записи в одно время, это определенно может привести к перегрузке оперативной памяти сервера.
Возможное решение: полностью избавиться от _edit_lock
Как отключить "Блокировку редактирования"?
Обычно WordPress должен хранить только один "_edit_lock" для каждой записи. Но в некоторых базах данных возникает проблема с их постоянным пересозданием.
Как у этого пользователя: http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta
Его решением было полное удаление всех таких записей. Для ускорения работы можно удалять их все каждую ночь в 3 часа через phpMyAdmin с помощью:
DELETE FROM `yourdb`.`wp_postmeta` WHERE `wp_postmeta`.`meta_key` = '_edit_lock'
Возможно, вы найдете подходящее задание для cron, которое будет выполнять эту операцию автоматически.
