mysql - 优化 WordPress 插件 "Better WordPress Recent Comments"中的慢查询

标签 mysql wordpress performance select optimization

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

这里是慢查询:

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

设置时间戳=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 条评论。这当然应该可以改进,以便在很短的时间内实际上只检查几条评论,因为它只显示最近发布的几条评论。谢谢。

最佳答案

我看到的主要问题之一是内部查询 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 过滤以获得所需的结果。

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

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

关于mysql - 优化 WordPress 插件 "Better WordPress Recent Comments"中的慢查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32915411/

相关文章:

sql - 新 MySQL 版本中 select 的 select 未完成

php - 如何使用MySql从phy中的组合框中获取选定的值?

javascript - 我应该在局部变量中引用 'this' 吗?

mysql - 从 Firebird 数据库连接到 MySQL 数据库

c# - 如何在继续之前等待 StartCoroutine() 完成

php - 在 WooCommerce 订单和电子邮件通知中显示自定义字段值

javascript 杀死了我的其他脚本。我该怎么做才能隔离它?

javascript - Wordpress - 我可以通过 url 访问正常的 php 文件,但没有上传的文件

Python 子进程 check_output 比调用慢得多

algorithm - 从 N 个数中找出最大和第二大的数