WordPress提供的每个页面的开头都有一个MySQL调用来获取选项:
SELECT option_name, option_value FROM wp_options WHERE autoload = \'yes\';
因为上没有索引
autoload
列,MySQL必须查找所有行。
我还看到了this answer 表示即使有指数,也不会有业绩提升。
在我的应用程序中,我使用了许多瞬态值作为会话替换。他们工作得很好,我有自己的垃圾收集程序。我注意到wp_options
表,我的瞬态值(以_transient_
) 都有autoload=no
. 我希望我的wp_options
表将随着并发用户数的增加而增加。
我想知道为什么桌子是这样设计的。我应该为我的特殊情况创建一个索引吗?
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堆栈中安装此类插件。。。