Dlaczego proste aktualizacje „_edit_lock” wp_postmeta są tak wolne?

11

W naszym dzienniku wolnych zapytań MySQL narastająco najwolniejsze zapytanie jest prostą aktualizacją wp_postmeta. Oto przykład:

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

Istotne szczegóły dotyczące naszej konfiguracji:

  • Czas wolnego zapytania MySQL ustawiony na 1s
  • Mechanizm magazynowania wp_postmeta to InnoDB
  • Działa w ramach dużej instalacji wielostanowiskowej z dziesiątkami tysięcy postów na głównym blogu WP (gdzie występują takie powolne zapytania)
  • Wysoka aktywność w obszarze administracyjnym WP (wielu pisarzy / redaktorów pracuje jednocześnie, ale ogólnie na własnych (nie innych) treściach)
  • Niska aktywność po publicznej stronie WP (w rzeczywistości nie wyświetla treści z głównego bloga)
  • Wydaje się, że wszystkie wolne zapytania używają klucza „_edit_lock”; zapytania w tym samym formacie (które używają klucza innego niż „_edit_lock”) nie wydają się być wolne.

Dlaczego jest to najwolniejsze zapytanie w naszym systemie? Czy ma to coś wspólnego ze specyficznym użyciem przez WP „blokad edycji”?

Dzięki! :)


Aktualizacja: Dane wyjściowe z mysqlsla poniżej:

______________________________________________________________________ 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';
rinogo
źródło
Ile otrzymujesz wyników SELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'; ?
adrian7
Dzięki za pytanie, adrian7! Istnieje 33 000 wierszy pasujących do Twojego zapytania. Nie jestem zaznajomiony z użyciem WP przez meta-klucz „_edit_lock”. Czy to nienormalne?
rinogo
nie jest nienormalne, wordpress używa go do ostrzegania użytkowników, gdy próbują edytować ten sam post / stronę. Sugeruję, aby usunąć wszystkie _edit_locks z wp_postmeta, oczywiście, gdy nie ma nikogo, kto edytuje i sprawdza po poprawie wydajności. (BTW najpierw wykonaj kopię zapasową).
adrian7
3
Czy zajmuje Ci to również dużo czasu, gdy właśnie SELECTwpisujesz ten wpis? Jak SELECT * FROM wp_postmeta` GDZIE post_id= 94705 AND meta_key= '_edit_lock'; `?
fischi
@fischi: To zapytanie wydaje się brać od 45-50ms, przynajmniej w testach, które zrobiłem kilka chwil temu. Jednak możliwe jest, że czasami zajmie to bardzo dużo czasu (np. Do 84 sekund, jak pokazano w wynikach mysqlsla zawartych w pytaniu). Przeprowadzę nową rundę powolnej analizy zapytań, aby sprawdzić, czy któraś z moich ostatnich zmian w naszej konfiguracji wpłynęła na zapytania.
rinogo

Odpowiedzi:

3

_edit_lock jest generowany za każdym razem, gdy edytujesz post lub stronę. składa się z kodu czasowego i użytkownika. więc WordPress wie, kto aktualnie go edytuje.

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

jeśli manipulujesz nim WordPress reaguje w jakiś sposób wrażliwy ... Próbowałem pobrać, ile sekund ktoś pracował nad postem. Cały czas łamał mi czas ładowania bazy danych.

Tak jak powiedziałeś, uruchamiasz to na dużej witrynie. Nie wiem, ilu użytkowników pisze tam posty, ale na pewno mogłoby to zepsuć pamięć RAM serwera, jeśli wielu osobom edytuje post w tym samym czasie.

Rozwiązaniem może być: pozbyć się _edit_lock

Jak wyłączyć blokadę post / edytuj blokadę?

Zwykle WordPress powinien mieć „_edit_lock” jeden na post. Niektóre bazy danych mają problem z generowaniem ich za każdym razem.

Jak ten facet http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta

Jego rozwiązaniem było usunięcie ich wszystkich. Aby przyspieszyć, możesz je usuwać co noc o 3 w phpMyAdmin przy pomocy

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

być może znajdziesz pracę crona, która właśnie to robi.

miejsce
źródło
0

Spróbuj tego :)

UPDATE `wp_postmeta` 
    SET `meta_value` = concat(unix_timestamp(),':386')  
    WHERE `post_id`  = 94705 
      AND `meta_key` = '_edit_lock';
demopix
źródło