为什么对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慢查询时间设置为1s
  • 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';

你得到多少结果SELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'; ?
adrian7 2014年

感谢您的问题,adrian7!有33k行匹配您的查询。我不熟悉WP对“ _edit_lock”元密钥的用法。这是异常吗?
rinogo 2014年

它不是异常,当用户试图编辑相同的帖子/页面时,wordpress会用它来警告用户。我建议您从wp_postmeta中删除所有_edit_locks,显然是在没有人编辑的情况下,并检查性能是否提高。(顺便说一句,先备份)。
adrian7

3
仅当您SELECT输入此条目时,还会花费大量时间吗?就像SELECT * FROM wp_postmeta` WHERE post_id= 94705 AND meta_key='_edit_lock';`?
fischi 2014年

@fischi:至少在我刚才进行的测试中,该查询似乎需要45-50ms。但是,有可能偶尔会花费很长时间(例如,最多84秒,如问题中包含的mysqlsla输出所示)。我将进行新一轮的慢速查询分析,以查看我最近对配置的任何更改是否影响了查询。
rinogo 2014年

Answers:


3

每次您编辑帖子或页面时都会生成_edit_lock。它由时间码和用户组成。因此WordPress知道谁正在编辑它。

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

如果您操纵它,WordPress会以某种敏感的方式做出反应...我试图获取某人在帖子上工作了几秒钟。一直困扰着我的数据库加载时间。

如您所说,您是在大型多站点上运行此代码的。不知道有多少用户在那写帖子,但是如果有很多人同时编辑一个帖子,那肯定会破坏服务器的RAM。

一个解决方案可能是:摆脱_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工作。


0

尝试这个 :)

UPDATE `wp_postmeta` 
    SET `meta_value` = concat(unix_timestamp(),':386')  
    WHERE `post_id`  = 94705 
      AND `meta_key` = '_edit_lock';
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.