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';

いくつの結果が得られSELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'ますか。?
adrian7 2014

質問をありがとう、adrian7!クエリに一致する33k行があります。WPでの '_edit_lock'メタキーの使用についてはよくわかりません。これは異常ですか?
rinogo 2014

これは異常ではなく、ワードプレスはユーザーが同じ投稿/ページを編集しようとしているときにユーザーに警告するためにそれを使用します。誰も編集していない場合は明らかに、wp_postmetaからすべての_edit_locksを削除し、パフォーマンスの向上を確認することをお勧めします。(BTWが最初にバックアップを作成します)。
adrian7 2014

3
SELECTこのエントリーだけでもかなり時間がかかりますか?同様SELECT * FROM wp_postmeta` post_id= 94705 AND meta_key= '_edit_lock'; `?
フィスキ2014年

@fischi:そのクエリは、少なくとも数分前に行ったテストでは、45〜50ミリ秒かかるようです。ただし、場合によっては非常に長い時間がかかることがあります(たとえば、質問に含まれているmysqlslaの出力に示されているように、最大​​84秒)。遅いクエリ分析の新しいラウンドを実行して、構成に対する最近の変更のいずれかがクエリに影響を与えたかどうかを確認します。
rinogo 2014年

回答:


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」が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ジョブを見つけるかもしれません。


0

これを試して :)

UPDATE `wp_postmeta` 
    SET `meta_value` = concat(unix_timestamp(),':386')  
    WHERE `post_id`  = 94705 
      AND `meta_key` = '_edit_lock';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.