Почему простые обновления wp_postmeta «_edit_lock» такие медленные?

11

В нашем журнале медленных запросов 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
  • Запуск в большой мультисайтовой установке с десятками тысяч постов в основном блоге WP (где происходят медленные запросы)
  • Высокая активность в области администрирования WP (много писателей / редакторов работают одновременно, но, как правило, на своем (не чужом) контенте)
  • Низкая активность на публичной стороне WP (на самом деле не показ контента из основного блога)
  • Медленные запросы, кажется, все используют ключ "_edit_lock"; запросы того же формата (которые используют ключ, отличный от «_edit_lock»), не кажутся медленными.

Почему это самый медленный запрос в нашей системе? Это как-то связано со специфическим использованием WP «правок блокировки»?

Спасибо! :)


Обновление: вывод из 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';
rinogo
источник
Сколько результатов вы получите за SELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'; ?
adrian7
Спасибо за ваш вопрос, adrian7! Есть 33k строк, соответствующих вашему запросу. Я не знаком с использованием мета-ключа _edit_lock в WP. Это ненормально?
Риного
это не ненормально, WordPress использует его для предупреждения пользователей, когда они пытаются редактировать один и тот же пост / страницу. Я предлагаю вам удалить все _edit_locks из wp_postmeta, очевидно, когда нет никого редактирующего и проверяйте после каких-либо улучшений производительности. (Кстати, сначала сделайте резервную копию).
adrian7
3
Это также занимает огромное количество времени, когда вы только SELECTэту запись? Как SELECT * FROM wp_postmeta` WHERE post_id= 94705 AND meta_key= '_edit_lock'; `?
fischi
@fischi: кажется, что этот запрос занимает 45-50 мс, по крайней мере, в тестировании, которое я только что провел несколько минут назад. Однако, возможно, что это иногда будет занимать очень много времени (например, до 84 секунд, как показано в выводе mysqlsla, включенном в вопрос). Я проведу новый раунд медленного анализа запросов, чтобы увидеть, повлияли ли какие-либо из моих недавних изменений в нашей конфигурации на запросы.
Риного

Ответы:

3

_edit_lock генерируется каждый раз, когда вы редактируете сообщение или страницу. он состоит из временного кода и пользователя. так что WordPress знает, кто сейчас его редактирует.

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

если вы им манипулируете, WordPress реагирует как-то чувствительно ... Я пытался узнать, сколько секунд кто-то работал над сообщением. Все время это нарушало время загрузки моей базы данных.

Как вы сказали, вы запускаете это на большом мультисайте. Не знаю, сколько пользователей пишут сообщения там, но это определенно может сломать оперативную память сервера, если многие люди редактируют сообщение одновременно.

Решение может быть таким: избавиться от _edit_lock

Как отключить «Post Lock / 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, которая делает именно это.

seot
источник
0

попробуй это :)

UPDATE `wp_postmeta` 
    SET `meta_value` = concat(unix_timestamp(),':386')  
    WHERE `post_id`  = 94705 
      AND `meta_key` = '_edit_lock';
demopix
источник