文章有两千多条评论,打开详情页要八秒,慢查询日志里同一条 commentmeta 关联查询反复出现,扫描行数两万多。乍看像缓存或者权限的锅,追下去往往不是。
ALTER TABLE wp_commentmeta ADD INDEX idx_meta_key (meta_key(32)); ALTER TABLE wp_comments ADD INDEX idx_post_status (comment_post_ID, comment_approved);
追下去是这么回事:按 meta_key 取点赞数时没有对应索引,每次都要扫全表。评论列表的查询又按文章编号加状态过滤,没有联合索引,数据量一大就顶不住。主题还额外查了一遍总数,等于跑两次。
「评论查询慢」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
具体做法是,用 EXPLAIN 看这条查询走了哪个索引,重点看 rows 和 type 两列;给 commentmeta 的 meta_key 加索引,评论表补文章编号与状态的联合索引;列表和总数共用一次查询结果,别再单独跑 count。
验收就看一点,同一个页面打开时间降到一秒内,慢查询日志里不再出现这条语句。
