为什么对wp_postmeta的“_EDIT_LOCK”的简单更新如此缓慢?

时间:2014-02-21 作者:rinogo

在我们的MySQL慢速查询日志中,累积最慢的查询是对wp\\U Posteta的简单更新。下面是一个示例:

UPDATE `wp_postmeta`
  SET `meta_value` = \'1392835505:386\'
  WHERE `post_id` = 94705 AND `meta_key` = \'_edit_lock\';
有关我们设置的相关详细信息:

MySQL慢速查询时间设置为1s的wp\\u Posteta的存储引擎是InnoDB,在一个大型多站点安装中运行,在主要的wp博客上有成千上万的帖子(这些慢速查询发生在这里)

  • wp管理区域的活动性很高(很多作者/编辑同时工作,但通常是自己(而不是其他人)的内容)
  • 上的活动性很低WP的公共端(实际上不提供来自主博客的内容)
  • 缓慢的查询似乎都是使用了“\\u edit\\u lock”键;相同格式的查询(使用“\\u edit\\u lock”以外的键)似乎不会太慢

    谢谢!:)

    更新: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\';
    

  • 3 个回复
    SO网友:seot

    每次编辑帖子或页面时都会生成\\u edit\\u锁。它由时间码和用户组成。所以WordPress知道目前是谁在编辑它。

    meta_id     post_id     meta_key    meta_value
    9           5           _edit_lock  1388386997:1
    
    如果你操纵它WordPress的反应有些敏感。。。我试图找出有人在一个帖子上工作了多少秒。它一直在破坏我的数据库加载时间。

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

    解决方案可能是:去掉\\u edit\\u lock

    How to disable the "Post Lock/Edit Lock"?

    通常,WordPress应该为每篇文章设置一个“\\u edit\\u lock”。有些数据库每次生成它们都有问题。

    就像这个家伙http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta

    他的解决办法是把它们全部删除。为了加快速度,您可以在phpMyAdmin每晚3点用

    DELETE FROM `yourdb`.`wp_postmeta` WHERE `wp_postmeta`.`meta_key` = \'_edit_lock\'
    
    也许你会找到一份cron的工作来做这件事。

    SO网友:demopix

    try this :)

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

    很可能,简单的方法是使用WP方法。

    update_post_meta($post_id, \'_edit_lock\', time().\':\'.$user_id);

    结束