Por que as atualizações simples do "_edit_lock" de wp_postmeta são tão lentas?

11

Em nosso log de consultas lentas do MySQL, a consulta cumulativamente mais lenta é uma atualização simples para wp_postmeta. Aqui está um exemplo:

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

Detalhes relevantes sobre nossa configuração:

  • Tempo de consulta lento do MySQL definido como 1s
  • O mecanismo de armazenamento do wp_postmeta é o InnoDB
  • Executando em uma grande instalação Multisite com dezenas de milhares de postagens no blog principal do WP (onde essas consultas lentas estão ocorrendo)
  • Alta atividade na área de administração do WP (muitos escritores / editores trabalhando simultaneamente, mas geralmente por conta própria (não de outros))
  • Baixa atividade no lado público do WP (não exibindo conteúdo do blog principal)
  • As consultas lentas parecem estar todas usando a tecla "_edit_lock"; consultas do mesmo formato (que usam uma chave diferente de "_edit_lock") não parecem lentas.

Por que essa é a consulta mais lenta do nosso sistema? Isso tem algo a ver com o uso específico do WP de "editar bloqueios"?

Obrigado! :)


Atualização: Saída do mysqlsla abaixo:

______________________________________________________________________ 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
fonte
Quantos resultados você obtém SELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'; ?
adrian7
Obrigado pela sua pergunta, adrian7! Existem 33 mil linhas correspondentes à sua consulta. Não estou familiarizado com o uso da meta-chave '_edit_lock' do WP. Isso é anormal?
rinogo 24/02
não é anormal, o wordpress o usa para alertar os usuários quando eles estão tentando editar o mesmo post / página. Sugiro que você exclua todos os _edit_locks do wp_postmeta, obviamente quando não houver ninguém editando e verificando após melhorias no desempenho. (Faça um backup primeiro).
adrian7
3
Também leva muito tempo quando você faz SELECTessa entrada? Como SELECT * FROM wp_postmeta` WHERE post_id= 94705 AND meta_key= '_edit_lock'; `?
fischi
@ischi: Essa consulta parece demorar de 45 a 50ms, pelo menos nos testes que fiz alguns momentos atrás. No entanto, é possível que ocasionalmente demore muito tempo (por exemplo, até 84 segundos, como mostrado na saída do mysqlsla incluída na pergunta). Vou executar uma nova rodada de análise lenta de consultas para ver se alguma das minhas alterações recentes em nossa configuração afetou as consultas.
rinogo 13/03

Respostas:

3

o _edit_lock é gerado sempre que você edita uma postagem ou página. consiste no código de tempo e no usuário. então o WordPress sabe quem o está editando no momento.

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

se você o manipular, o WordPress reage de alguma forma sensível ... Tentei buscar quantos segundos alguém trabalhou em um post. O tempo todo quebrou o tempo de carregamento do meu banco de dados.

Como você disse, você está executando isso em um grande multisite. Não sei quantos usuários escrevem postagens lá, mas definitivamente poderia quebrar a RAM do servidor se muitas pessoas editarem uma postagem ao mesmo tempo.

Uma solução poderia ser: livrar-se de _edit_lock

Como desativar o "Post Lock / Edit Lock"?

Normalmente, o WordPress deve ter o "_edit_lock" um por Post. Alguns bancos de dados têm o problema de gerá-los sempre.

Gosto desse cara http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta

Sua solução foi excluir todos eles. Para acelerar, você pode excluí-los todas as noites às 3 horas no phpMyAdmin com

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

pode ser que você encontre um trabalho cron fazendo exatamente isso.

seot
fonte
0

tente isso :)

UPDATE `wp_postmeta` 
    SET `meta_value` = concat(unix_timestamp(),':386')  
    WHERE `post_id`  = 94705 
      AND `meta_key` = '_edit_lock';
demopix
fonte