问题描述

我正在努力调整一个受到缓慢加载时间的 wordpress 网站,我发现主页似乎需要更多的时间来加载。这不是因为内容,因为我正在考虑基本请求结束所需的时间 (可以通过 firefox 中的 firebug 查看) 。

此外,我尝试在自定义页面中复制 index.php 代码,并且相同的确切代码在大约 1 秒内加载,而主要加载大约为 7. 我注意到单页加载速度更快,起初我以为是因为内容的差异,但在这个测试之后,我不知道是什么原因造成的。

wordpress 在主要索引的背后有什么东西吗?是否有其他方式来解释这种情况,更重要的是修复它,以便主页加载更快?

更新 – 真正的解决方案

经过大量的盲目尝试,我创建了一个名为 home 的新页面,它使用 index.php 作为自定义模板 (不是副本,相同的文件) 。我将任何呼叫重定向到它的基本路径 (通过 wordpress 的 「内部重写」),并且我拥有与之前相同的主页,仅在 1/6 的时间加载。当我对结果感到满意时,我很想知道发生了什么。

另一个更新

所以这个点似乎是我不能使用这个网站的动态 (在 wordpress 的意义上) 页面,它只适用于通过各种功能插入内容的自定义”static” 页面,正常的循环使家庭很慢 (具有高内存限制) 或只是空白 (低内存限制,脚本失败) 。

按照 this question 的建议,我创建了一个链接到自定义页面的静态主页,它工作正常。我还创建了一个博客页面 (再次使用自定义模板),它也可以正常工作 (“fine” 意味着它显示我的空测试页面只包含一个单词,没有代码),除非我在 admin 中指定为”Posts page” – > 阅读设置。换句话说,一旦 wordpress 看到一个动态页面 (一个应该保持主循环的页面),它就会产生一些非常沉重的东西,这样做会使很多 ram 成为可能。

仍在寻找原因,我可以解决它,但我真的很想知道问题是什么。

编辑:添加赏金

更多信息:我尝试禁用所有插件,wordpress 更新到最新版本。

进一步编辑:表索引

wp_posts:

PRIMARY KEY  (`ID`),
KEY `type_status_date` (`post_type`,`post_status`(1),`post_date`,`ID`),
KEY `post_status_date_gmt` (`post_status`(1),`post_date_gmt`),
KEY `post_date` (`post_date`),
KEY `post_date_gmt` (`post_date_gmt`),
KEY `post_parent` (`post_parent`),
KEY `post_name` (`post_name`),
KEY `post_status` (`post_status`),
KEY `post_author` (`post_author`),
FULLTEXT KEY `post_related` (`post_name`,`post_content`),
FULLTEXT KEY `post_content` (`post_content`,`post_title`),

wp_term_relationships:

PRIMARY KEY  (`object_id`,`term_taxonomy_id`),
KEY `term_taxonomy_id` (`term_taxonomy_id`)

wp_term_taxonomy:

PRIMARY KEY  (`term_taxonomy_id`),
UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`),
KEY `taxonomy` (`taxonomy`)

最佳解决方案

我希望与前两个意见不同。

使用静态主页会导致 WP 在帖子表的主键上使用索引扫描,而在帖子表中与 post_date,状态或 post_parent 上的 (哦偶尔) 索引扫描相结合。

实质上,由于 WP 中的数据库设计不佳,主页是死慢的。该模式在分类表上具有可笑的多列索引,MySQL 简单地忽略了一个有意义的数量的帖子。事实上,我们使用表格太多分类法也没有帮助。

在数据库中,安全地添加索引:

CREATE INDEX extra_posts ON posts (post_type,post_status,post_date DESC)
CREATE INDEX extra_term_rel ON term_relationships(term_taxonomy_id,object_id)
CREATE INDEX extra_term_tax ON term_taxonomy(taxonomy,term_taxonomy_id,term_id)

这不会是完美的,但至少 WP 将能够在您的首页上使用 index-based 嵌套循环计划…

哦,和… 如果您在首页上使用任何类型的自定义帖子类型,您还需要添加:

posts(post_status,post_date DESC)

否则,由于 OR 子句,所有的索引都将被用于主查询。

次佳解决方案

默认情况下,主页的性能没有任何差异。然而,有一个插件可能会在该页面上执行一些缓慢的事情。

有很多插件来描述 WP 性能。我通常使用 WP Tuner,但对于最新的 WP 版本似乎是坏的,所以我没有立即更换建议。

最简单的方法是包装模板充满时间/ memory 标记。

printf(  '%d queries in %.3f seconds, using %.2fMB memory', get_num_queries(), timer_stop( 0, 3 ), memory_get_peak_usage() / 1024 / 1024 );

这是粗糙的,但经常允许精确定位发生放缓的地点。

第三种解决方案

经过近 4 年的时间,我回到了这一切,终于找到了这个问题。原来网站上有很多文章都被标记为粘性。由于令人难以置信的愚蠢的 WordPress 用于标记粘贴帖子 (wp_options 中的序列化数组),动态主页的主循环花了很长时间。清除表中的 sticky_posts 字段修复了问题。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。