De ce sunt atât de lente actualizările simple în wp_postmeta pentru "_edit_lock"?
În jurnalul nostru de interogări lente MySQL, cea mai lentă interogare cumulativ este o simplă actualizare în wp_postmeta. Iată un exemplu:
UPDATE `wp_postmeta`
SET `meta_value` = '1392835505:386'
WHERE `post_id` = 94705 AND `meta_key` = '_edit_lock';
Detalii relevante despre configurația noastră:
- Timpul pentru interogări lente MySQL setat la 1s
- Motorul de stocare pentru wp_postmeta este InnoDB
- Rulează într-o instalație WordPress Multisite mare cu zeci de mii de articole pe blogul principal WP (unde apar aceste interogări lente)
- Activitate ridicată în zona de administrare WP (mulți autori/editori lucrează concomitent, dar în general pe propriul conținut)
- Activitate redusă pe partea publică a WP (nu se servește conținut din blogul principal)
- Interogările lente par să folosească toate cheia "_edit_lock"; interogări de același format (care folosesc alte chei decât "_edit_lock") nu par să fie lente.
De ce aceasta este cea mai lentă interogare pe sistemul nostru? Are legătură cu modul specific în care WP folosește "edit locks"?
Mulțumesc! :)
Actualizare: Ieșirea din mysqlsla mai jos:
______________________________________________________________________ 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';
_edit_lock este generat de fiecare dată când editezi un articol sau o pagină. Conține timestamp-ul și utilizatorul, astfel WordPress știe cine editează în acel moment.
meta_id post_id meta_key meta_value
9 5 _edit_lock 1388386997:1
Dacă manipulezi această valoare, WordPress poate reacționa destul de sensibil... Am încercat să calculez câte secunde a lucrat cineva la un articol. De fiecare dată mi-a afectat timpul de încărcare al bazei de date.
Cum ai menționat că rulezi un multisite mare. Nu știu câți utilizatori scriu articole acolo, dar cu siguranță poate cauza probleme de RAM pe server dacă prea mulți oameni editează articole în același timp.
O soluție ar putea fi: să elimini _edit_lock
Cum să dezactivezi "Post Lock/Edit Lock"?
În mod normal, WordPress ar trebui să aibă o singură înregistrare "_edit_lock" per articol. Unele baze de date au probleme generându-le de fiecare dată.
Ca în cazul acestui utilizator http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta
Soluția lui a fost să le șteargă pe toate. Pentru a accelera procesul, poți să le ștergi pe toate în fiecare noapte la ora 3 în phpMyAdmin cu
DELETE FROM `yourdb`.`wp_postmeta` WHERE `wp_postmeta`.`meta_key` = '_edit_lock'
sau poți configura un cron job care să facă exact asta.
