mysql – 为什么对wp_postmeta的引用如此之慢?

在WordPress中获取属性(使用MySQL)似乎比必要的慢.

(这是一个自我回答的问题,请继续回答.)

解决方法:

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.
>由于“聚类”,InnoDB进一步提升了PK的性能. (我希望你还没有使用MyISAM!)
>如果您使用的是MySQL 5.6(或MariaDB 10.0或10.1),请从VARCHAR(255)更改meta_key,而不是VARCHAR(191). (如果191还不够,我们可以在一个单独的问题中讨论原因和解决方法.)
> INDEX(meta_key)是可选的,但如果您想“查找具有特定键的帖子”,则需要它.
>警告:这些变化将加速postmeta的许多用途,但不是全部.我认为它不会减慢任何用例. (如果遇到这些问题,请提供此类查询.这可能是一个缓存问题,而不是真正的降级.)

如果您想要展示您的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

Source doc

可能的改变

注意事项:

>我无法测试这个.
>这不解决767错误
>这保留了meta_id,因为一些WP用户指出它被其他表引用.
>它假设您可能有多个行(post_id,meta_key)组合. (这看起来很糟糕的架构设计?)
>所有这一切都加快了涉及postmeta的典型SELECT.
>这也可能适用于woocommerce.
>如果您使用此功能,请转储您的数据库并准备好在发生问题时重新加载它.

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
上一篇:Java数组索引以某种方式超出界限?


下一篇:python – 熊猫标量值获取和设置:ix还是iat?