TP5.1 数据库 CPU 飙升卡顿?利用 EXPLAIN 分析慢查询添加复合索引
作者:水悠悠予安
时间:2026-07-14
浏览:3
TP5.1项目数据库CPU飙升至95%以上,页面响应超10秒。经慢日志定位到多条件联合查询索引失效,使用EXPLAIN分析发现type为ALL、key为NULL。按最左前缀原则,将等值查询字段status、is_pay放前,范围字段created_at放后,添加复合索引后CPU降至30%以下,查询时间降至0.x秒。
本文目录
## 定位高负载 SQL
先进入 MySQL 命令行,执行 **【SET GLOBAL slow_query_log = ON;】** 开启慢日志(如果之前没开过)。同时确认 long_query_time 设为 1 秒:`SET long_query_time = 1;`。
接着查出最近 5 条最耗时的慢 SQL:
```sql
SELECT query_time, sql_text FROM mysql.slow_log ORDER BY query_time DESC LIMIT 5;
```
复制其中一条典型语句,比如:
```sql
SELECT id,name,created_at FROM user_order WHERE status = 1 AND is_pay = 1 AND created_at > '2023-01-01' ORDER BY created_at DESC;
```
## 用 EXPLAIN 看执行计划
在该 SQL 前加上 EXPLAIN 关键字并执行:
```sql
EXPLAIN SELECT id,name,created_at FROM user_order WHERE status = 1 AND is_pay = 1 AND created_at > '2023-01-01' ORDER BY created_at DESC;
```
重点看 **type** 字段——如果显示 `ALL` 或 `index`,说明走了全表扫描或全索引扫描;再看 **key** 字段是否为 `NULL`,`NULL` 就是没走任何索引;**rows** 值如果接近表总行数(比如表有 80 万行,rows 显示 792341),基本可以断定索引失效了。
还需要留意的是,EXPLAIN 结果中的 **Extra** 如果出现 `Using filesort` 或 `Using temporary`,说明排序或分组无法利用索引,这也会极大拖慢速度。
## 设计复合索引
**第一步**:提取 WHERE 条件中所有等值查询字段,按出现顺序排列。这里的 `status` 和 `is_pay` 都是 `=` 查询,优先放前面;`created_at` 是范围查询(`>`),必须放在等值字段之后,否则后续字段没法命中索引。
**第二步**:把 ORDER BY 字段追加到索引末尾。本例中 ORDER BY `created_at DESC`,而 `created_at` 已经在 WHERE 里作为范围条件,直接复用就行,不需要重复添加。但如果排序字段与 WHERE 中不一致(比如 ORDER BY id),就得额外补上。
**第三步**:生成建索引语句:
```sql
ALTER TABLE user_order ADD INDEX idx_status_ispay_ctime (status, is_pay, created_at);
```
这里字段顺序绝不能搞错。如果写成 `(created_at, status, is_pay)`,MySQL 在遇到 `created_at > '2023-01-01'` 时,后面两个等值字段就完全失效了——**复合索引最左前缀原则不可绕过**。
## 验证索引生效
验证方法有三条路可走。**方法一**:再次执行 EXPLAIN,确认 key 列显示为 `idx_status_ispay_ctime`,type 变成 `ref` 或 `range`,rows 值从几十万降到几百或几千。**方法二**:用 FORCE INDEX 强制走新索引对比性能:
```sql
SELECT id,name,created_at FROM user_order FORCE INDEX(idx_status_ispay_ctime) WHERE status = 1 AND is_pay = 1 AND created_at > '2023-01-01' ORDER BY created_at DESC;
```
**方法三**:观察线上监控——`top -H` 查看 mysqld 进程线程 CPU 占用,5 分钟内应从 95%+ 降至 30% 以下;同时用 `SHOW PROCESSLIST` 观察该 SQL 的 Time 值,是否从数百秒降至 0.x 秒。
作者最新文章
立刻MV如何查看立刻MV官方操作指引文档
2026-11-02 14:05
抖音创作平台官网登录入口
2026-11-02 10:38
Xshell连接SSH失败怎么办?5步排查网络、代理与认证问题
2026-10-30 14:30
樱花动漫官方正版官网入口在哪_樱花动漫网址2027最新分享
2026-10-28 19:21
AO3永久可用网址分享 ao3实时访问入口
2026-10-28 13:16
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多

































