在WordPress中获取属性(使用MySQL)似乎比必要的慢。
(这是一个自我回答的问题,请继续回答。)
答案 0 :(得分:3)
wp_postmeta
的标准架构提供了糟糕的索引。这会导致性能问题。
通过将架构更改为此,大多数对元数据的引用会更快:
CREATE TABLE wp_postmeta (
post_id …,
meta_key …,
meta_value …,
PRIMARY KEY(post_id, meta_key),
INDEX(meta_key)
) ENGINE=InnoDB;
注意:
AUTO_INCREMENT
列浪费了空间,并且因为它是PRIMARY KEY
而减慢了查询速度,从而避开了(post_id, meta_key)
的“自然”“复合”PK。meta_key
更改VARCHAR(255)
,而不是VARCHAR(191)
。 (如果191还不够,我们可以在一个单独的问题中讨论原因和解决方法。)INDEX(meta_key)
是可选的,但如果您想“查找具有特定密钥的帖子”,则需要这些内容。如果您想提交 CREATE TABLE
,我可以提供ALTER
将其转换为此内容。
如果您需要为一个帖子提供多个具有相同键名的元键,请使用此解决方案。它几乎与上述建议一样好。
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
可能的ALTER
注意事项:
meta_id
,因为某些WP用户指出它被其他表引用。SELECTs
涉及postmeta。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