Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que as referências ao wp_postmeta são tão lentas?


O esquema padrão para wp_postmeta fornece índices ruins. Isso leva a problemas de desempenho.

Ao alterar o esquema para isso, a maioria das referências a metadados será mais rápida:
CREATE TABLE wp_postmeta (
    post_id …,
    meta_key …,
    meta_value …,
    PRIMARY KEY(post_id, meta_key),
    INDEX(meta_key)
) ENGINE=InnoDB;

Notas:
  • O AUTO_INCREMENT atual coluna é um desperdício de espaço e torna as consultas mais lentas porque é a PRIMARY KEY , evitando assim o PK "composto" "natural" de (post_id, meta_key) .
  • O InnoDB aumenta ainda mais o desempenho desse PK devido ao "clustering". (Espero que você ainda não esteja usando o MyISAM!)
  • Se você estiver usando MySQL 5.6 (ou MariaDB 10.0 ou 10.1), altere meta_key de VARCHAR(255) , não VARCHAR(191) . (Podemos discutir os motivos e soluções alternativas em uma pergunta separada, se 191 não for suficiente.)
  • INDEX(meta_key) é opcional, mas necessário se você quiser "encontrar postagens que tenham uma chave específica".
  • Aviso:essas mudanças acelerarão muitos usos de postmeta, mas não todos. Eu não acho ele irá desacelerar qualquer caso de uso. (Forneça essas consultas se você as encontrar. Pode ser um problema de cache, não uma degradação real.)

Se você gostaria de apresentar seu CREATE TABLE , posso fornecer um ALTER para convertê-lo para isso.

Se você precisar ter várias meta-chaves com o mesmo nome de chave para uma postagem, use esta solução. É quase tão bom quanto a sugestão acima.
    meta_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,  -- keep after all
    ...
    PRIMARY KEY(post_id, meta_key, meta_id),  -- to allow dup meta_key for a post

Documento de origem

Possível ALTER

Advertências:
  • Não tenho como testar isso.
  • Isso não resolve o erro 767
  • Isso mantém meta_id porque algum usuário do WP apontou que ele é referenciado por outras tabelas.
  • Assume-se que você pode ter várias linhas para um combo (post_id, meta_key). (Isso parece um design de esquema ruim?)
  • Tudo o que isso faz é acelerar os SELECTs típicos envolvendo postmeta.
  • Isso provavelmente se aplica ao woocommerce também.
  • Se você usar isso, despeje seu banco de dados e esteja pronto para recarregá-lo em caso de problemas.

O SQL:
ALTER TABLE wp_postmeta
    DROP PRIMARY KEY,
    DROP INDEX post_id,
    ADD PRIMARY KEY(post_id, meta_key, meta_id),  -- to allow dup meta_key for a post
    ADD INDEX(meta_id);    -- to keep AUTO_INCREMENT happy