Warum sind einfache Updates für wp_postmetas "_edit_lock" so langsam?


11

In unserem MySQL-Protokoll für langsame Abfragen ist die kumulativ langsamste Abfrage ein einfaches Update von wp_postmeta. Hier ist ein Beispiel:

UPDATE `wp_postmeta`
  SET `meta_value` = '1392835505:386'
  WHERE `post_id` = 94705 AND `meta_key` = '_edit_lock';

Relevante Details zu unserem Setup:

  • Die langsame Abfragezeit von MySQL ist auf 1s eingestellt
  • Die Speicher-Engine von wp_postmeta ist InnoDB
  • Wird in einer großen Multisite-Installation mit Zehntausenden von Posts im Haupt-WP-Blog ausgeführt (wo diese langsamen Abfragen auftreten).
  • Hohe Aktivität im WP-Administrationsbereich (viele Autoren / Redakteure arbeiten gleichzeitig, aber im Allgemeinen für ihre eigenen (nicht für andere) Inhalte)
  • Geringe Aktivität auf der öffentlichen Seite von WP (keine Inhalte aus dem Hauptblog bereitstellen)
  • Die langsamen Abfragen scheinen alle den Schlüssel "_edit_lock" zu verwenden. Abfragen desselben Formats (die einen anderen Schlüssel als "_edit_lock" verwenden) scheinen nicht langsam zu sein.

Warum ist dies die langsamste Abfrage auf unserem System? Hat dies etwas mit der spezifischen Verwendung von "Bearbeitungssperren" durch WP zu tun?

Vielen Dank! :) :)


Update: Ausgabe von mysqlsla unten:

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

Wie viele Ergebnisse Sie bekommen für SELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'; ?
Adrian7

Danke für deine Frage, adrian7! Es gibt 33.000 Zeilen, die Ihrer Abfrage entsprechen. Ich bin nicht mit der Verwendung des Metaschlüssels '_edit_lock' durch WP vertraut. Ist das abnormal?
Rinogo

Es ist nicht ungewöhnlich. WordPress verwendet es, um Benutzer zu warnen, wenn sie versuchen, denselben Beitrag / dieselbe Seite zu bearbeiten. Ich schlage vor, dass Sie alle _edit_locks aus dem wp_postmeta löschen, offensichtlich, wenn niemand etwas bearbeitet und nach Leistungsverbesserungen überprüft. (Übrigens machen Sie zuerst ein Backup).
Adrian7

3
Dauert es auch sehr lange, wenn Sie nur SELECTdiesen Eintrag haben? Wie SELECT * FROM wp_postmeta` WHERE post_id= 94705 AND meta_key= '_edit_lock'; `?
Fischi

@fischi: Diese Abfrage scheint zwischen 45 und 50 ms zu dauern, zumindest in den Tests, die ich vor wenigen Augenblicken durchgeführt habe. Es ist jedoch möglich, dass es gelegentlich sehr lange dauert (z. B. bis zu 84 Sekunden, wie in der in der Frage enthaltenen mysqlsla-Ausgabe gezeigt). Ich werde eine neue Runde langsamer Abfrageanalysen durchführen, um festzustellen, ob sich meine letzten Änderungen an unserer Konfiguration auf die Abfragen ausgewirkt haben.
Rinogo

Antworten:


3

Der _edit_lock wird jedes Mal generiert, wenn Sie einen Beitrag oder eine Seite bearbeiten. Es besteht aus dem Timecode und dem Benutzer. WordPress weiß also, wer es gerade bearbeitet.

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

Wenn du es manipulierst, reagiert WordPress irgendwie empfindlich ... Ich habe versucht herauszufinden, wie viele Sekunden jemand an einem Beitrag gearbeitet hat. Die ganze Zeit hat es meine Datenbankladezeit unterbrochen.

Wie Sie sagten, führen Sie dies auf einer großen Multisite aus. Ich weiß nicht, wie viele Benutzer dort Beiträge schreiben, aber es könnte definitiv den RAM des Servers beschädigen, wenn zu viele Leute gleichzeitig einen Beitrag bearbeiten.

Eine Lösung könnte sein: _edit_lock loswerden

Wie deaktiviere ich die "Nachsperre / Bearbeitungssperre"?

Normalerweise sollte WordPress das "_edit_lock" pro Post haben. Einige Datenbanken haben das Problem, sie jedes Mal zu generieren.

Wie dieser Typ http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta

Seine Lösung bestand darin, sie alle zu löschen. Um es zu beschleunigen, können Sie sie alle jede Nacht um 3 Uhr in phpMyAdmin mit löschen

DELETE FROM `yourdb`.`wp_postmeta` WHERE `wp_postmeta`.`meta_key` = '_edit_lock'

Vielleicht finden Sie einen Cron-Job, der genau das tut.


0

Versuche dies :)

UPDATE `wp_postmeta` 
    SET `meta_value` = concat(unix_timestamp(),':386')  
    WHERE `post_id`  = 94705 
      AND `meta_key` = '_edit_lock';
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.