wordpress 是不是通过自动索引来优化其数据库表?

Posted

技术标签:

【中文标题】wordpress 是不是通过自动索引来优化其数据库表?【英文标题】:Does wordpress optimize its database tables by indexing automatically?wordpress 是否通过自动索引来优化其数据库表? 【发布时间】:2019-06-30 18:45:43 【问题描述】:

显然,为 mysql 表添加索引可以加快访问速度。

WordPress 是否会生成这种简单的优化,或者我应该手动执行它,还是使用众多优化插件之一?

例如:在phpMyadmin中你只需要选择table optimize来生成索引

【问题讨论】:

手动执行和/或使用数据库优化插件。 WordPress 并没有开箱即用(我猜这是因为这在某些情况下会导致问题),因此存在许多这些数据库优化插件的原因。 【参考方案1】:

根据开发人员认为最有用的索引,Wordpress 在为您的数据库创建表时确实会创建许多索引。

例如,查看 https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/schema.php 并查看所有 KEYs(KEY 是 INDEX 的同义词)。

但是,可能会有更多索引。在任何数据库中都应该根据运行最频繁或需要最高效运行的查询来定义索引。

Percona 博客在 2014 年发表了一篇文章,展示了他们的 Wordpress 数据库可能使用额外索引的案例。该博客准确地展示了他们如何使用性能分析工具来查找慢速案例,然后设计一个索引来解决性能问题。

“Analyzing WordPress MySQL queries with Query Analytics”(percona.com,2014-01-16)

需要额外索引的情况或多或少是他们对 Wordpress 的使用所特有的。该博客的重点不是告诉人们您需要添加哪些索引,而是演示分析数据库的方法,以便您找到性能热点。

适合您的索引取决于您对 Wordpress 的使用。

【讨论】:

【参考方案2】: 请使用ENGINE=InnoDB,而不是 MyISAM 不要将OPTIMIZE TABLE 与innodb 表一起使用,这几乎不值得付出努力。 WP 确实有索引,但不一定是最佳索引。 为了提高性能,尤其是当您的查询涉及postmetaChange the postmeta schema 时。

【讨论】:

感谢您提供有用的信息。为什么选择 InnoDB 而不是 MyISAM? @Mulli 以我对这个问题的回答为例:***.com/a/17706717/20860【参考方案3】:

不,默认情况下,WordPress 不会为 mysql 表添加索引。正如您所提到的,您可以使用 WP-Optimize 之类的插件或使用 phpMyAdmin 进行优化:

要执行优化,请登录到您的 phpMyAdmin 并选择要优化其表的数据库。

将出现一个包含所有数据库表的列表。勾选您要优化的表,或直接点击[Check All]选择所有表。

从 [With selected:] 下拉菜单中选择优化表。这将对选定的表执行 OPTIMIZE TABLE SQL 查询,它们将被更新和优化。

【讨论】:

OPTIMIZE TABLE 与索引无关。 "OPTIMIZE TABLE 与索引无关" 不知道@BillKarwin 在这里的真正含义,因为OPTIMIZE TABLE 实际上对现有索引做了一些事情,因为它会优化(重组) 物理存储索引大小和表文件以使其更快...但通常OPTIMIZE TABLE 只有在表发生大量插入/更新/删除/ 更改时才真正有意义 OPTIMIZE TABLE 没有定义新的索引,这就是我认为的问题所在。通常,OPTIMIZE TABLE 不会使表更快。在 Raymond 提到的情况下,它可能会对表进行碎片整理,其中有大量行已更改。我不认为这会对性能产生重大影响。【参考方案4】:

不,WordPress 不会自动添加数据库索引。

首先,如果您还没有将表转换为 InnoDB。

其次,确保您运行的是最新的 MySQL 版本。 (MySQL 8+,MariaDB 10.2+)。如果您使用托管服务提供商并且他们无法获得最新的 MySQL 版本,请解雇他们。

第三,使用数据库清理插件从数据库中清除过时的垃圾(帖子草稿、wp_options 中的临时数据等等)。繁忙的 WordPress 实例会积累大量垃圾,只会减慢速度。 Advanced Database Cleaner 不错。还有很多其他的。

第四,运行 these changes 到 wp_postmeta 的键对你的性能有很大帮助。

ALTER TABLE wp_postmeta ADD UNIQUE KEY meta_id (meta_id);
ALTER TABLE wp_postmeta DROP PRIMARY KEY;
ALTER TABLE wp_postmeta ADD PRIMARY KEY (post_id, meta_key, meta_id);
ALTER TABLE wp_postmeta DROP KEY post_id;
ALTER TABLE wp_postmeta DROP KEY meta_key;
ALTER TABLE wp_postmeta ADD KEY meta_key (meta_key, post_id);

Rick James 和我已经发布了WP plugin to do all that,并为其他表添加了更好的索引。

【讨论】:

哇。谢谢你这么好的回答!您的插件是必需的,但在城里似乎是新的,我需要它用于要求苛刻的生产环境。如果它失败了——如果有的话,它会造成什么伤害? 先做数据库清理,看看效果如何。你是对的,我们的插件只有一个月大。尽管如此,我们还是让拥有 100,000 个帖子和 400 万个 postmeta 条目(!!!)的人成功使用了它。那个人用了不到五分钟的时间来转换 postmeta。可能发生的最糟糕的事情是什么?您必须从备份中恢复 MySQL 数据。上面的 ALTER TABLE 内容正是它对 postmeta 所做的。 (该插件在更改密钥时将您的站点置于维护模式;如果您自己运行 ALTER TABLE 东西,它不会这样做。) 刚开始使用插件。一切顺利!太棒了。但似乎没有性能提升。 (每一秒都很重要!)。它是一个生产环境。我不能只恢复备份(&b 松散的工作......) 也许您可以使用Query Monitor 插件(在一天中的安静时间找到性能最差的 MySQL 查询?我很乐意看看它们。 只是为了让你知道我做了一些改进。检查您的插件。然后,从备份中恢复数据库。以前的结果要好约 20%。我仍然相信你的工作值得付出努力,但可能仍然缺少一些东西。

以上是关于wordpress 是不是通过自动索引来优化其数据库表?的主要内容,如果未能解决你的问题,请参考以下文章

如何改善数据库的结构,以及如何使用索引来缩短搜索时间

高效的 SQL 查询或索引来查找所有列是不是只有 1 个值

MySQL 是不是使用现有索引来创建新索引?

数据库优化SQL优化原则

如何根据名称而不是索引来订购选择?

通过取相对于其他系列的相交索引来过滤掉一个系列