我正在优化针对 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/