为什么`wp_options`表没有`autoload`的索引?

时间:2013-05-04 作者:He Shiming

WordPress提供的每个页面的开头都有一个MySQL调用来获取选项:

SELECT option_name, option_value FROM wp_options WHERE autoload = \'yes\';
因为上没有索引autoload 列,MySQL必须查找所有行。

我还看到了this answer 表示即使有指数,也不会有业绩提升。

在我的应用程序中,我使用了许多瞬态值作为会话替换。他们工作得很好,我有自己的垃圾收集程序。我注意到wp_options 表,我的瞬态值(以_transient_) 都有autoload=no. 我希望我的wp_options 表将随着并发用户数的增加而增加。

我想知道为什么桌子是这样设计的。我应该为我的特殊情况创建一个索引吗?

3 个回复
最合适的回答,由SO网友:fuxia 整理而成

没有指数,因为对它的需求从来都不够强烈。

在里面ticket #14258 有人建议,但由于大多数选项使用autoload=yes 默认情况下,无论如何都会忽略索引。

还有一张仍然开放的票#24044 _Add index to wp_options to aid/improve performance_.

我认为你应该创建一个索引。它将经受住升级。这可能对您的性能没有帮助,但您可以向该票据添加真实的统计数据。

<小时>

Update November 2019

该索引已添加到WordPress 5.3中。最后请参阅上述票证#24044和developer notes for the release.

请注意,如果现有索引具有相同的名称,则在升级过程中会收到警告。

changeset:

大多数站点将不受此更改的影响,但是wp_options, 只有一小部分autoload 设置后,将看到显著的性能改进
中有大量行的站点wp_options, 他们中的许多人autoload 不幸的是,set在运行的查询速度已经非常慢的情况下会出现性能下降,但这应该是少数情况。

SO网友:Fabio Pedrazzoli

我在一个Debian Squeeze大型实例上运行了3个WP博客,并正在调查为什么mysql在该主机上停留在200%的CPU使用率和3到6之间的系统负载下。通过查看mysql中的“显示进程列表”,我们了解到wp\\U选项表涉及此问题,因此我们执行了:

alter table wp_options add index autoload_idx(`autoload`);
在此操作之后,如上图所示,mysql负载急剧下降到1%,实例平均负载现在为0.10。

我们正在使用一些插件,以便在代码中的某个地方有一个循环,这可能是一种特殊情况,但在我们的情况下,性能的变化是非常惊人的。

我们的wp\\U选项表有347行。

SO网友:Jesse Nickles

虽然@fuxia accepted answer 涉及一些“声称”的原因(其中大多数是Automatic的员工在各种Trac票据等上声称的),WordPress Core的根本原因不包括wp_options 表是Automatic担心它会对仍在使用MyISAM引擎的MySQL数据库的性能产生负面影响。

具体来说,他们指的是WordPress。org网站本身是一个非常古老/复杂的数据库,例如其性能会受到此类索引影响的网站。

在过去9年中,几乎所有其他未添加该指数的原因(是的,自2010年以来,Trac罚单#14258 自2013年起,Trac罚单#24044) WordPress社区的数十名成员一再证明这些测试是不正确的,但参与测试的自动化员工却一再忽视了几个独立的基准测试,转而提及MyISAM的担忧。

谢天谢地,2019年末PHP 7.2 现在是WordPress Core推荐的“默认”版本,使用InnoDB引擎,现在是的默认版本MySQL after 5.5, 在包括@DanBUK在内的多家开发商的持续压力下,Automatic最终让步,决定在2019年11月增加WordPress 5.3+的自动加载指数。

我们在LittleBizzy启动了first known plugin 如果该索引不存在,它会自动添加该索引,该索引仍然可以在GitHub上使用并定期下载。请注意,如果您正在运行WP Core 5.3+,则不再需要在WordPress堆栈中安装此类插件。。。

结束

相关推荐

Error: options page not found

这个错误是众所周知的,无论我在哪里看到它,要么我没有做:<form method=\"post\" action=\"options.php\"> 或者我没有注册我的选项,这与以下类中的情况不同:class CoreTheme_AdminPanel_Admin implements AisisCore_Interfaces_Admin{ public function __construct(){ add_action(\'admin