优化 WordPress 插件“更好的 WordPress 最近评论”中的慢查询

     2023-02-24     91

关键词:

【中文标题】优化 WordPress 插件“更好的 WordPress 最近评论”中的慢查询【英文标题】:Optimize slow query in WordPress plugin "Better WordPress Recent Comments" 【发布时间】:2015-12-31 03:36:44 【问题描述】:

我正在优化针对 MySQL 的查询,我的慢查询日志显示 WordPress 插件“更好的 WordPress 最近评论”小部件显示按帖子分组的最近 5 个 cmets,它使用 1.26 秒查询数据库,这是一个一个网站的时间很长 - 特别是当下一个网站只需点击一下。

这里是慢查询:

Query_time:1.265625 Lock_time:0.000000 Rows_sent:6 Rows_examined:288634

SET 时间戳=1443741678;

SELECT wpcoms.*
FROM (
SELECT *,
@num := if(@post_id = comment_post_ID, @num + 1, 1) as row_number,
@post_id := comment_post_ID as cpID
FROM wp_comments
WHERE comment_approved = 1 ORDER BY comment_post_ID DESC,
comment_ID DESC
) as wpcoms
WHERE wpcoms.row_number <= 2
ORDER BY wpcoms.comment_date DESC
LIMIT 6;

检查的行数为 288.634,但我的数据库仅包含 96.000 cmets。这当然应该可以改进,以便在很短的时间内实际上只检查几个 cmets,因为它显示的只有少数最近发布的 cmets。谢谢。

【问题讨论】:

这两个 order by 语句对我来说是可疑的,并确保您的 comment_approved 和 comment_approved 字段已编入索引。你可以在没有子选择的情况下做到这一点吗?为什么需要row_number?似乎子选择中的唯一点是产生 row_number 如果是这种情况(codex.wordpress.org/Transients_API),则将结果放入transient 缓存中。还要确保sql_calc_found_rows 在查询期间不存在,因为这将在很大程度上影响性能。 【参考方案1】:

我看到的主要问题之一是内部查询 SELECT *, @num...,因为它会导致全表扫描,这将导致 MySQL 不使用 comment_approved 索引。

这样做的原因很简单,因为如果您查看查询,它实际上是在告诉 MySQL 选择表中按帖子 ID 排序的每一行,没有限制。

mysql> explain SELECT *, @post_id := comment_post_ID as cpID FROM wp_comments WHERE comment_approved = 1 ORDER BY comment_post_ID DESC, comment_ID DESC LIMIT 10;
+----+-------------+-------------+------+---------------------------+------+---------+------+------+-----------------------------+
| id | select_type | table       | type | possible_keys             | key  | key_len | ref  | rows | Extra                       |
+----+-------------+-------------+------+---------------------------+------+---------+------+------+-----------------------------+
|  1 | SIMPLE      | wp_comments | ALL  | comment_approved_date_gmt | NULL | NULL    | NULL |  567 | Using where; Using filesort |
+----+-------------+-------------+------+---------------------------+------+---------+------+------+-----------------------------+

问题的另一部分是comment_post_ID 的排序

考虑一下这将使用索引:

mysql> explain SELECT *, @post_id := comment_post_ID as cpID FROM wp_comments WHERE comment_approved = 1 ORDER BY comment_date_gmt DESC LIMIT 10;
+----+-------------+-------------+-------+---------------------------+------------------+---------+------+------+-------------+
| id | select_type | table       | type  | possible_keys             | key              | key_len | ref  | rows | Extra       |
+----+-------------+-------------+-------+---------------------------+------------------+---------+------+------+-------------+
|  1 | SIMPLE      | wp_comments | index | comment_approved_date_gmt | comment_date_gmt | 8       | NULL |   10 | Using where |
+----+-------------+-------------+-------+---------------------------+------------------+---------+------+------+-------------+

后一种查询可能会影响您的结果,但效率会高得多。

更好的解决方案可能是 MySQL 查询和 PHP 过滤的某种组合以获得所需的结果。

由于这是一个插件,您可以考虑将其作为插件开发人员的问题打开,因为它会导致任何具有大量 cmets 的网站的性能不佳。

此答案绝不是解决方案,但希望为您指明正确的方向。当涉及到一个包含大量 cmets 的站点时,需要真正重新考虑查询和处理的逻辑。

【讨论】:

我尝试了您的建议,只需在“ORDER BY comment_post_ID DESC, comment_ID DESC”中加入 LIMIT 100,查询时间就从 1.265 秒提高到了 0.125 秒。通过将 ORDER BY 字段更改为“comment_date_gmt”以及您的完整建议 LIMIT 100,将查询改进为 0.0000 秒。大奖!非常感谢您,draw010!我会通知插件的开发者更改他的代码。我已经用你的新语句更新了 .php 文件,它运行完美! :-) @Frank 我很高兴您能够根据我的建议更改查询并获得所需的结果,同时看到巨大的性能提升。很高兴为您提供帮助!【参考方案2】:

在没有看到实际数据并进行有根据的猜测的情况下,您正在寻找最近的“已批准”帖子,然后希望获得每个帖子最近的 2 个 cmets。整体查询还可以,我只是更进一步,试一试。

SELECT 
      wpcoms.*
   FROM 
      ( SELECT 
              *,
              @num := if(@post_id = c1.comment_post_ID, @num + 1, 1) as row_number,
              @post_id := c1.comment_post_ID as cpID
           FROM 
              ( select distinct c2.comment_post_id
                   from wp_comments c2
                   where c2.comment_approved = 1
                   order by c2.comment_post_id desc
                   limit 6 ) Just6
                   JOIN wp_comments c1
                   ON Just6.comment_post_id = c1.comment_post_id
           WHERE 
              c1.comment_approved = 1 
           ORDER BY 
              c1.comment_post_ID DESC,
              c1.comment_ID DESC
      ) as wpcoms
   WHERE 
      wpcoms.row_number <= 2
   ORDER BY 
      wpcoms.comment_date DESC
   LIMIT 6;

唯一真正的调整是有一个内部子查询,该查询仅对具有已批准评论 DISTINCT PER COMMENT_POST_ID 的评论帖子 ID 值进行预限定,并将其限制为仅 6 条记录。通过这样做,并在这些合格的comment_post_id 上重新加入到 cmets 表中,您不会查询所有可能的帖子,而只是查询合格的 6 个帖子。从那时起,这些 cmets 被减少到每个评论帖子最多只有 2 个,然后最终确定您的列表总共有 6 个条目。但是,如果您总是想要 6 个评论帖子,请摆脱外部限制 6。这样,您最多可以拥有 12 个条目,这对于 6 个内部限定的评论帖子 ID 值来说是 2 个可能的条目。

现在,不知道您的索引,我建议您在 wp_cmets 表上使用以下两个复合索引。但至少索引 #1

1.  ( comment_approved, comment_post_id )
2.  ( comment_post_id, comment_id )

【讨论】:

wordpress的seo插件——wordpressseobyyoast安装及使用

插件:WordPressSEObyyoast 使用方法:做好网站SEO一直是站长们的愿望,说简单也简单,但是说难也难,因为需要注意的地方太多,一个不小心被百度K了你都不知道怎么回事。这里和大家推荐一下这款名叫 WordPressSEObyYoast ... 查看详情

wordpress和discuz哪个收录

个人觉得wordpress收录更好,不过都有针对的seo优化方法,开始的时候wordpress比较好(有插件可以使用)参考技术A看你怎么去优化,优化好的话收录就上去了。用DZ比较麻烦的就是广告信息很多。要控制好。不然的话等下整个网站... 查看详情

wordpress性能优化:为什么我的博客比你的快

 WordPress很慢?很多博主都会感觉WordPress很慢?作为全世界最常用的建站和博客系统WordPress来说,在性能设计上肯定不会有太大的问题,WordPress开发团队也肯定也考虑到这个问题。那么WordPress效率问题主要是出在哪里呢?根据... 查看详情

如何安装wpsupercache加速wordpress网站访问速度

当为WordPress站点安装了一些插件后,我们经常需要面对一个问题就是加载速度的优化,安装的插件越多,对于网站加载速度影响越大,如果你想提升WordPress加载速度,一个简单易行的方法就是使用缓存插件,本文中我们教大家如... 查看详情

wordpress插件是啥意思

WordPress插件就像为您的网站添加功能的软件或应用程序。您也可以考虑手机上的应用程序之类的插件。您的智能手机本身功能非常强大,但是大多数魔术都发生在应用程序中。您有一个音乐应用程序,一个电子邮件应用程序和一... 查看详情

wordpress插件过多很臃肿,怎么优化

缓存就指很多方便了,比如 CDN 缓存、静态缓存、数据库缓存、浏览器缓存等等。1、CDN 缓存:CDN 的话最好是备案了再起飞,因为大多数没备案的 CDN 都是给美国节点,而很多人是香港服务器,那岂不是绕... 查看详情

有没有好的wordpress + php-fpm + nginx + mysql 内存优化技巧?

】有没有好的wordpress+php-fpm+nginx+mysql内存优化技巧?【英文标题】:Arethereanygoodwordpress+php-fpm+nginx+mysqlmemoryoptimizationtips?【发布时间】:2011-11-0105:33:39【问题描述】:有一个VPS有512MB限制,它使用wordpress(带有一些插件)+php-fpm+ngin... 查看详情

怎么清理优化wordpress数据库

一、数据库表清理1.wordpress数据库表wp_commentmeta:用于保存评论的元信息,在将评论放入回收站等操作时会将数据放入此表,Akismet等插件也会生成此表的数据。此表不太重要wp_comments:用于保存评论信息的表wp_links:用于保存用户输入... 查看详情

wordpress删除seo插件生成的结构化数据(代码片段)

Wordpress插件 YoastSEO会默认添加上结构化数据  但是这种结构化数据内容有限,如果需要添加自定义的结构化数据,就需要安装一些专门做结构化数据优化的插件,所以这些结构化插件都会有一个选项,就是不加载SEO默... 查看详情

如何移动优化wordpress博客

】如何移动优化wordpress博客【英文标题】:Howtomobileoptimizewordpressblog【发布时间】:2014-07-2503:20:12【问题描述】:我的wordpress博客(workmoneyfun.com)是完全移动响应的GenesisFrameworkProse主题。但是,我增加了网站内容区域的宽度,导致... 查看详情

php的93个wordpress插件有后门

参考技术A因为93个WordPress主题和插件包含后门,从而使得攻击者可以完全控制网站。攻击者总共入侵了AccessPress的40个主题和53个插件,AccessPress是WordPress插件的开发者,用于超过360,000个活动网站。该攻击是由Jetpack的研究人员发... 查看详情

为 wordpress 优化 MariaDB

】为wordpress优化MariaDB【英文标题】:OptimizingMariaDBforwordpress【发布时间】:2017-09-1620:22:26【问题描述】:我有一台有2个CPU内核和1GB内存的服务器。该服务器只运行一个wordpress站点。我的服务器堆栈是LEMP。我在设置wordpress站点两... 查看详情

优化 Wordpress 查询

】优化Wordpress查询【英文标题】:OptimizingaWordpressQuery【发布时间】:2017-05-1100:20:46【问题描述】:我正在开发一个拥有大型产品数据库的WordPress网站。我需要列出所有具有单个分类术语例外的产品。使用wp_query()会创建一个巨大... 查看详情

WordPress - SQL 查询优化

】WordPress-SQL查询优化【英文标题】:WordPress-SQLQueryOptimization【发布时间】:2019-08-0221:29:00【问题描述】:将条件(meta_key=\'items\')添加到我的查询中是否更好,或者这不是必需的。我告诉自己,将研究限制在只有meta_key等于items的... 查看详情

Wordpress 安装插件失败:无法找到 WordPress 插件目录

】Wordpress安装插件失败:无法找到WordPress插件目录【英文标题】:Wordpressfailstoinstallplugins:UnabletolocateWordPressPlugindirectory【发布时间】:2014-01-0712:27:26【问题描述】:我无法在我的Centos6VPS上安装插件。当我尝试安装时,我得到了... 查看详情

wordpress - 错误 403 文件 javascript 插件 wordpress

】wordpress-错误403文件javascript插件wordpress【英文标题】:wordpress-Error403filejavascriptpluginwordpress【发布时间】:2013-12-3007:23:46【问题描述】:我的wordpress插件有问题,网站有插件,插件没有加载javascript,当我去链接插件here时,它说... 查看详情

优化 Wordpress 数据库设计

】优化Wordpress数据库设计【英文标题】:OptimizeWordpressDatabaseDesign【发布时间】:2016-06-1107:52:45【问题描述】:我正在使用WordPress房地产主题。后元表中的帖子太多。每个属性帖子产生超过20个元数据并进入该帖子元表。因此,如... 查看详情

Wordpress 插件如何要求安装最低 Wordpress 版本?

】Wordpress插件如何要求安装最低Wordpress版本?【英文标题】:HowdoWordpresspluginsrequireaminimumWordpressversiontobeinstalled?【发布时间】:2021-01-2221:34:56【问题描述】:我一直在尝试弄清楚Wordpress插件(无论是自定义的还是可从Wordpress网站... 查看详情