线上有个接口 P99 飙到 3.4s,最终定位到一条没走索引的 ORDER BY。
排查步骤
# 1. 打开慢日志
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 0.5;
# 2. 抓现场
pt-query-digest /var/log/mysql/slow.log --limit 5EXPLAIN 里 rows 是 41 万,Extra 只有 Using where,没有 Using index——典型的排序落盘。
修复
ALTER TABLE typecho_contents
ADD INDEX idx_status_created (status, created DESC);加完索引,同一 SQL 从 2.8s 降到 41ms。
| 阶段 | 耗时 | rows examined |
|---|---|---|
| 原始 | 2810ms | 412,663 |
| 强制索引 | 320ms | 8,900 |
| 新复合索引 | 41ms | 1,024 |
教训:DESC 索引在 MySQL 8.0 才真正生效,5.7 上只是解析通过。
收藏了,正好在纠结要不要从 Hugo 换回来。
这个表格在手机上会溢出吧,建议套一层横向滚动。
同遇到过快照锁,最后用 pt-online-schema-change 绕过的。