【发布时间】:2017-10-07 03:31:38
【问题描述】:
在 WordPress(使用 MySQL)中获取属性似乎比必要的要慢。
(这是一个自我回答的问题,所以请继续我的回答。)
【问题讨论】:
标签: mysql wordpress performance indexing entity-attribute-value
在 WordPress(使用 MySQL)中获取属性似乎比必要的要慢。
(这是一个自我回答的问题,所以请继续我的回答。)
【问题讨论】:
标签: mysql wordpress performance indexing entity-attribute-value
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
【讨论】: