Como a tabela `wp_options` não possui um índice em` autoload`?

15

No início de cada página exibida pelo WordPress, há uma chamada do MySQL para buscar opções:

SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';

Como não há índice na autoloadcoluna, o MySQL precisa procurar TODAS as linhas.

Também deparei com o comentário desta resposta dizendo que não haveria ganho de desempenho, mesmo que houvesse um índice.

No meu aplicativo, usei muitos valores transitórios para servir como uma substituição de sessão. Eles funcionaram muito bem e eu tenho minhas próprias rotinas de coleta de lixo. Notei que na wp_optionstabela todos os meus valores transitórios (os que começam com _transient_) têm autoload=no. Espero que o número de linhas da minha wp_optionstabela aumente à medida que o número de usuários simultâneos aumenta.

Gostaria de saber por que a tabela foi projetada dessa maneira. E devo criar um índice para o meu caso específico?

Ele Shiming
fonte

Respostas:

11

Não há índice porque a necessidade nunca foi forte o suficiente.

No ticket # 14258 , foi sugerido, mas como a maioria das opções usa autoload=yespor padrão, o índice seria ignorado de qualquer maneira.

Também há o tíquete ainda aberto # 24044 _Adicionar índice a wp_options para ajudar / melhorar o desempenho_ .

Eu acho que você deve criar um índice. Ele sobreviverá a atualizações. Pode não ajudar no seu desempenho, mas você pode adicionar dados estatísticos reais a esse ticket.


Atualização novembro 2019

O índice foi adicionado ao WordPress 5.3. Finalmente. Veja o ticket nº 24044 mencionado acima e as notas do desenvolvedor para o lançamento .

Observe que se você tiver um índice existente com o mesmo nome, receberá um aviso durante a atualização.

No conjunto de alterações :

A maioria dos sites não será afetada por essa alteração, mas aqueles com um grande número de linhas wp_options, apenas um pequeno número autoloaddefinido, terão uma melhora significativa no desempenho.
Sites com um grande número de linhas wp_options, com muitos deles autoloadconfigurados, infelizmente, sofrerão uma penalidade no desempenho, além das consultas já muito lentas que estão sendo executadas, mas essa deve ser a minoria dos casos.

fuxia
fonte
1
Tanto quanto eu posso dizer através da leitura # 24044, as tabelas antigas do MyISAM teriam uma regressão de desempenho, as novas tabelas do InnoDB se beneficiariam principalmente. Estou convertendo todas as minhas tabelas herdadas para o InnoDB e definindo um índice na autoloadcoluna.
21818 lkraav #
Depois de tantos anos, finalmente foi abordado pela equipe do WordPress. Um índice foi adicionado awp_options.autoload . Fontes: make.wordpress.org/core/2019/10/15/… ... e ... core.trac.wordpress.org/ticket/24044#comment:87 ... Parabéns ao @DanBUK que propôs esse recurso em 2013.
Jee
Obrigado, @Jee, eu atualizei a resposta.
fuxia
5

Estou executando 3 blogs WP em uma instância grande do Debian Squeeze e estava investigando por que o mysql estava preso naquele host com 200% de uso da CPU e carga do sistema entre 3 e 6. Observando uma 'lista de processos de exibição' dentro do mysql, entendemos o A tabela wp_option estava envolvida neste problema, então executamos:

alter table wp_options add index autoload_idx(`autoload`);

Após esta operação, o carregamento do mysql, como mostrado na parte superior, caiu drasticamente para 1% e a média de carregamento da instância agora é de 0,10.

Estamos usando alguns plugins para que possa haver um loop em algum lugar do código, e isso pode ser uma situação específica, mas, no nosso caso, a mudança no desempenho é totalmente surpreendente.

Nossa tabela wp_options possui 347 linhas.

Fabio Pedrazzoli
fonte
2
Obrigado por compartilhar. Imaginei que o WordPress tinha um defeito ao lidar com esta tabela de opções. É tão pequeno que não deveria estar consultando. Deve ser select *uma vez por todas. Em vez disso, está consultando cada opção, é por isso que colocar um índice fará uma grande diferença.
Shiming
0

Enquanto a resposta aceita pelo @fuxia toca em alguns motivos "reivindicados" (muitos dos quais foram reivindicados pelos funcionários da Automattic em vários tickets do Trac, etc.), o motivo subjacente do WordPress Core não incluir um índice para as opções de carregamento automático na tabela é que A Automattic preocupou-se com o impacto negativo no desempenho dos bancos de dados MySQL que ainda estavam usando o mecanismo MyISAM.wp_options

Especificamente, eles apontaram para o próprio site WordPress.org, sendo um banco de dados muito antigo / complexo, como um exemplo de site cujo desempenho seria prejudicado por esse índice.

Quase todos os outros motivos para não adicionar o índice nos últimos 9 anos (sim, desde 2010 no caso do bilhete Trac nº 14258 e desde 2013 no caso do bilhete Trac nº 24044 ) foram repetidamente provados incorretos por dezenas de membros da Na comunidade WordPress, os funcionários da Automattic envolvidos ignoraram repetidamente vários testes de benchmark independentes e voltaram a mencionar as preocupações do MyISAM.

Felizmente, no final de 2019 com o PHP 7.2 agora a versão "padrão" recomendada pelo WordPress Core, e com o mecanismo InnoDB agora padrão nas versões do MySQL após a 5.5 , e com a pressão contínua de vários desenvolvedores, incluindo o @DanBUK, que permaneceram no assunto por anos , A Automattic finalmente desistiu e decidiu adicionar o índice de carregamento automático a partir do WordPress 5.3+ em novembro de 2019.

Em LittleBizzy, lançamos o primeiro plug-in conhecido que adicionava automaticamente o índice se ele não existisse, que ainda está disponível no GitHub e está sendo baixado regularmente. Observe que você NÃO precisa mais instalar esses plugins na sua pilha do WordPress se estiver executando o WP Core 5.3 + ...

jessuppi
fonte