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

10

No nosso log de consultas lentas do MySQL, a consulta cumulativamente mais lenta é uma atualização simples para o 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 do Multisite com dezenas de milhares de postagens no principal blog do WP (onde essas consultas lentas estão ocorrendo)
  • Atividade alta na área administrativa do WP (muitos editores / editores trabalhando simultaneamente, mas geralmente por conta própria (não de outros))
  • Baixa atividade no lado público do WP (não na verdade disponibilizando conteúdo do blog principal)
  • As consultas lentas parecem estar usando a tecla "_edit_lock"; consultas do mesmo formato (que usam uma chave diferente de "_edit_lock") não parecem ser lentas.

Por que essa é a consulta mais lenta em nosso sistema? 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';
    
por rinogo 21.02.2014 / 18:04

1 resposta

2

o _edit_lock é gerado toda vez que você edita uma postagem ou página. consiste no timecode e no usuário. então o WordPress está sabendo quem está editando atualmente.

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

se você manipulá-lo o WordPress reage de alguma forma sensível ... Eu tentei buscar quantos segundos alguém trabalhou em um post. Todo o tempo que quebrou meu tempo de carregamento do banco de dados.

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

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

Como desabilitar o "Bloqueio de postagem / bloqueio de edição"

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

Como esse cara enlace

Sua solução foi deletar todos eles. Para acelerar, você pode deletar 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 cron job exatamente assim.

    
por seot 02.04.2014 / 03:25