Se o seu plug-in tiver MUITOS dados, use wp_postmeta
NÃO é uma boa ideia, como demonstrado abaixo:
Tomando o WooCommerce como exemplo, em uma loja com ~ 30.000 produtos, haverá uma média de, digamos, ~ 40 post meta (atributos e tudo) por produto, 5 imagens de produto por produto, o que significa que haverá ~ 4 meta de imagem para cada imagem:
30.000 produtos x 40 meta cada = 1.200.000 linhas em wp_postmeta
+
30.000 produtos x 5 imagens cada x 4 meta de imagem para cada = 600.000 linhas em wp_postmeta
Portanto, com apenas 30.000 produtos, você espera ter 1.800.000 linhas wp_postmeta
.
Se você adicionar mais propriedades a seus produtos ou imagens de seus produtos, esse número será multiplicado.
O problema disso é duplo:
- As associações automáticas são muito caras com o MySQL
wp_postmeta
A tabela não é indexada, a menos que você esteja usando versões posteriores do mysql (ou seja, nenhum índice FULLTEXT para meta_value
)
Para dar um exemplo de um caso real:
SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE '_shipping_city'
Isso seleciona a cidade de remessa de todos os detalhes do pedido em aproximadamente 3 segundos em um servidor dedicado de nível de entrada, mesmo que haja 5 a 10 pedidos . Isso ocorre porque a consulta é executada entre uma wp_postmeta
tabela que possui ~ 3 milhões de linhas na instalação ao vivo.
Até a página inicial é bastante lenta, porque o tema extrai vários elementos wp_postmeta
- controles deslizantes, algumas inserções de revisão, algumas outras meta. Em geral, a listagem de produtos é muito lenta, as pesquisas são igualmente lentas ao listar produtos.
Você não pode consertar isso por qualquer meio normal. Você pode colocar o Elastic Search em seu servidor e usar um plug-in do Elastic Search no Wordpress, usar redis / memcached, usar um bom plug-in de cache de página, mas no final a questão fundamental permanecerá - buscando qualquer quantidade de dados de um inchado wp_postmeta
A tabela ficará lenta, sempre que estiver pronta. No servidor em que testei a solução que implementei abaixo, todas foram instaladas e configuradas adequadamente e otimizadas, e o site funcionou de maneira agradável para usuários não conectados ou para consultas comuns desde que os plug-ins de cache foram lançados.
Mas no momento em que um usuário logado tentou fazer algo que não era comumente feito, ou os crons, plug-ins de cache ou qualquer outro utilitário quiseram buscar dados reais do banco de dados para armazená-lo em cache ou fazer qualquer outra coisa, as coisas ficaram muito lentas.
Então, tentei outra coisa:
Codifiquei um pequeno plug-in para levar toda a meta do produto (postmeta para produto do tipo pós ) a uma tabela personalizada gerada pelo código. Este plug-in pegou todas as meta para cada postagem e criou uma tabela adicionando cada meta como colunas e inserindo os valores em cada linha. Transformei o formato EAV em um formato relacional horizontal e plano. Eu também tinha o plugin para excluir o postmeta de todos os produtos movidos da wp_postmeta
tabela.
Enquanto estou nisso, movi o postmeta do anexo e a meta de todos os outros tipos de post para suas próprias tabelas.
Em seguida, liguei-me ao get_(post_type)_meta
filtro para substituir a recuperação de metadados para servi-los de novas tabelas personalizadas.
Agora, a mesma consulta anterior, que levou ~ 3 segundos para buscar, wp_postmeta
leva ~ 0,006 segundos. O site agora se comporta como se fosse uma nova instalação do WP.
....................
Naturalmente, fazer as coisas da maneira Wordpress é melhor. Na verdade, é a norma.
No entanto , também é óbvio o conhecimento de que a tabela EAV é muito ineficiente no dimensionamento. É infinitamente flexível e permite armazenar todos os dados, mas o preço pago por isso é o desempenho. É uma troca fundamental.
Nesse contexto, é difícil dizer a alguém que pretende ter uma tonelada de dados e - Deus não permita - consultar / pesquisar esses dados para usar a wp_postmeta
tabela com certeza. O sucesso no desempenho será ótimo.
O uso de suas tabelas personalizadas permitirá que seus dados se acumulem e continuem sendo rápidos o suficiente.
Assim como Pippin Williams, o criador do plug-in Easy Digital Downloads mencionou que ele usaria tabelas personalizadas se estivesse apenas começando a codificar seu plug-in, se você criar algo que será usado por muito tempo ou acumular muitos dados, é mais eficiente usar suas tabelas personalizadas se você as projetar bem.
Você deve se certificar de que qualquer outro desenvolvedor de plug-ins / addons tenha meios de se conectar ao seu plug-in para manipular seus dados antes e depois da recuperação dos dados. Se você fizer isso, será bastante sólido.