web-dev-qa-db-ja.com

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です
  • メインのWPブログに何万もの投稿がある大規模なMultisiteインストール内で実行する(これらの遅いクエリが発生しているところ)
  • 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';
11
rinogo

投稿またはページを編集するたびに_edit_lockが生成されます。タイムコードとユーザーで構成されています。そのため、WordPressは現在誰が編集しているのかを知っています。

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

あなたがそれを操作するならば、WordPressはどういうわけか敏感に反応します...私は誰かが投稿に取り組んだ何秒を取得しようとしました。それは私のデータベースのロード時間を壊していました。

あなたが言ったようにあなたは大規模なマルチサイトでこれを実行しています。何人のユーザがそこに投稿を書いているのかわからないが、多くの人が同時に投稿を編集すると、間違いなくサーバのRAMを壊す可能性がある。

解決策は次のとおりです。_edit_lockを取り除きます

"Post Lock/Edit Lock"を無効にするには?

通常WordPressはPostごとに "_edit_lock"を1つ持つべきです。データベースによっては毎回それらを生成する問題があります。

この男のように 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の仕事を見つけるかもしれません。

3
seot