Perché i semplici aggiornamenti di "_edit_lock" di wp_postmeta sono così lenti?


11

Nel nostro log delle query lente di MySQL, la query cumulativamente più lenta è un semplice aggiornamento di wp_postmeta. Ecco un esempio:

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

Dettagli rilevanti sulla nostra configurazione:

  • Il tempo di query lento di MySQL è impostato su 1s
  • Il motore di archiviazione di wp_postmeta è InnoDB
  • In esecuzione all'interno di una grande installazione multisito con decine di migliaia di post sul blog WP principale (dove si verificano queste query lente)
  • Elevata attività nell'area di amministrazione del WP (molti scrittori / editori lavorano contemporaneamente, ma generalmente sul proprio contenuto (non di altri))
  • Attività bassa sul lato pubblico di WP (in realtà non fornisce contenuti dal blog principale)
  • Le query lente sembrano tutte utilizzare il tasto "_edit_lock"; le query dello stesso formato (che utilizzano una chiave diversa da "_edit_lock") non sembrano lente.

Perché questa è la query più lenta sul nostro sistema? Ha qualcosa a che fare con l'uso specifico di "blocchi di modifica" di WP?

Grazie! :)


Aggiornamento: output da mysqlsla di seguito:

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

Per quanti risultati ottieni SELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'; ?
adrian7,

Grazie per la tua domanda, adrian7! Ci sono 33k righe corrispondenti alla tua query. Non ho familiarità con l'uso da parte di WP della meta-chiave '_edit_lock'. È anormale?
Rinogo,

non è anormale, wordpress lo usa per avvisare gli utenti quando stanno provando a modificare lo stesso post / pagina. Ti suggerisco di eliminare tutti i _edit_locks da wp_postmeta, ovviamente quando non c'è nessuno che li modifica e controlla dopo eventuali miglioramenti delle prestazioni. (BTW prima effettua un backup).
adrian7,

3
Ci vuole anche un sacco di tempo quando hai appena SELECTinserito questa voce? Come SELECT * FROM wp_postmeta` WHERE post_id= 94705 AND meta_key= '_edit_lock'; `?
fischi,

@fischi: Quella query sembra richiedere 45-50ms, almeno nei test che ho fatto solo pochi istanti fa. Tuttavia, è possibile che occasionalmente occorra molto tempo (ad es. Fino a 84 secondi, come mostrato nell'output di mysqlsla incluso nella domanda). Eseguirò un nuovo ciclo di analisi delle query lente per vedere se una delle mie recenti modifiche alla nostra configurazione ha influito sulle query.
Rinogo,

Risposte:


3

_edit_lock viene generato ogni volta che modifichi un post o una pagina. è costituito dal codice temporale e dall'utente. quindi WordPress sa chi lo sta attualmente modificando.

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

se lo manipoli WordPress reagisce in qualche modo sensibile ... Ho provato a recuperare quanti secondi qualcuno ha lavorato su un post. Per tutto il tempo ha rotto il tempo di caricamento del mio database.

Come hai detto, stai eseguendo questo su un grande sito. Non so quanti utenti scrivano messaggi lì, ma sicuramente potrebbe spezzare la RAM del server se a molte persone modificano un post allo stesso tempo.

Una soluzione potrebbe essere: sbarazzarsi di _edit_lock

Come disabilitare il "Blocco post / Modifica blocco"?

Normalmente WordPress dovrebbe avere "_edit_lock" per Post. Alcuni database hanno il problema di generarli ogni volta.

Come questo ragazzo http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta

La sua soluzione era di eliminarli tutti. Per velocizzarlo puoi cancellarli tutti ogni notte alle 3 in phpMyAdmin con

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

potresti trovare un lavoro cron che fa esattamente questo.


0

prova questo :)

UPDATE `wp_postmeta` 
    SET `meta_value` = concat(unix_timestamp(),':386')  
    WHERE `post_id`  = 94705 
      AND `meta_key` = '_edit_lock';
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.