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 é aPRIMARY 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
deVARCHAR(255)
, nãoVARCHAR(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