gpt4 book ai didi

mysql - 为什么对 wp_postmeta 的引用这么慢?

转载 作者:行者123 更新时间:2023-11-29 01:50:52 26 4
gpt4 key购买 nike

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

(这是一个 self 回答的问题,所以继续我的回答。)

最佳答案

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 而减慢了查询速度,从而避免了 的“自然”“复合”PK code>(post_id, meta_key).
  • InnoDB 通过“集群”进一步提升了 PK 的性能。 (我希望你不是还在使用 MyISAM!)
  • 如果您使用的是 MySQL 5.6(或 MariaDB 10.0 或 10.1),请将 meta_keyVARCHAR(255) 更改为 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 的典型 SELECTs
  • 这可能也适用于 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

插件 WP Index Improvements - 做那个改变,加上其他。 (如以下评论中所述。)

关于mysql - 为什么对 wp_postmeta 的引用这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43859351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com