【发布时间】: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在查询期间不存在,因为这将在很大程度上影响性能。
标签: mysql wordpress performance select optimization