MySQL生产环境定位全表扫描慢事务的排查方法
通过EXPLAIN的type字段为ALL、key为NULL、rows接近总行数等信号可判断全表扫描。使用SHOWPROCESSLIST或INFORMATION_SCHEMA PROCESSLIST快速定位慢查询。索引失效常见于函数调用、隐式类型转换、左模糊查询及联合索引顺序错误。建议优先覆盖WHERE条件加索引,并用pt-online-schema-chan
## 怎么快速揪出正在全表扫描的 SQL?
不必等到慢查询日志积累大量数据后再去分析。直接连接生产数据库,执行`SHOW PROCESSLIST`命令,查看当前活跃会话中哪些正在扫描大表:
- `State`是`Sending data`且`Time`超过几秒,大概率是在扫描;
- `Info`字段里包含`SELECT` + 大量`WHERE`条件但缺少`ORDER BY`或`LIMIT`,尤其要留意有没有函数调用(比如`DATE(created_at)`这种);
- 配合`INFORMATION_SCHEMA.PROCESSLIST`查询更全面:`SELECT ID, INFO, TIME FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND = 'Query' AND TIME > 3 AND INFO LIKE '%SELECT%';`
## EXPLAIN 里哪些信号说明它在全表扫描?
`EXPLAIN`不是走马观花,重点盯住三个字段:
- `type`是`ALL`:确凿证据,没有使用任何索引;
- `key`是`NULL`:即使`possible_keys`有值,`key`为空也等于索引未被采用;
- `rows`数字极大(比如超过50000):哪怕`type`是`index`,扫描整棵索引树也等价于全表扫描;
- `Extra`出现`Using where`但没`Using index`:说明查询使用了索引还需要回表,如果`rows`很大,实际开销接近全表扫描。
## 为什么明明建了索引还全表扫描?常见失效场景
索引存在 ≠ 被使用。以下几种写法会让MySQL直接放弃索引:
- WHERE中对字段使用了函数:`WHERE YEAR(create_time) = 2026` → 改为`WHERE create_time >= '2026-01-01' AND create_time < '2027-01-01'`;
- 隐式类型转换:`WHERE user_id = '123'`(`user_id`是INT类型)→ 字符串强制转为数字,索引失效;
- LIKE左模糊:`WHERE name LIKE '%abc'` → 无法走B+树前缀匹配;
- 联合索引顺序错误:`INDEX(a,b,c)`,但查询只用`WHERE c = 1` → 不满足最左前缀原则,直接跳过。
## 线上不敢随便改 SQL?先加索引试试
如果确认是缺失索引导致的`ALL`,添加索引比重写业务逻辑快得多,但需要注意:
- 优先覆盖`WHERE`条件字段,再追加`ORDER BY`和`SELECT`字段(做成覆盖索引);
- 避免单列索引堆砌,比如`WHERE a=1 AND b=2`,建`INDEX(a,b)`比分别建两个单列索引更好;
- 加索引前使用`pt-online-schema-change`或MySQL 8.0+的`ALGORITHM=INSTANT`,避免锁表;
- 加完索引后立即用`EXPLAIN`验证,不要相信“应该能走”。
全表扫描本身并不致命,致命的是它出现在高频接口或大表上。真正麻烦的是那些`rows`显示几千、但实际执行扫了百万行的SQL——`EXPLAIN`的预估不准时,需要借助`SHOW PROFILE`或性能模式(`performance_schema`)查看真实I/O开销。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Redis是什么:核心特性、架构与应用场景解析
Redis是一款基于内存的键值型NoSQL数据库,以超高读写速度和丰富的数据结构著称。本文系统梳理Redis的核心特性、架构组成、性能优势及典型应用场景,并通过与Memcached、MySQL、MongoDB的对比,帮助开发者快速判断Redis是否适合当前业务需求。
Windows 安装 MongoDB 完整图文教程
本文详细介绍在 Windows 系统上安装 MongoDB 的完整流程。从官网下载 MSI 安装包开始,逐步演示自定义安装路径、配置 Windows 服务、跳过 MongoDB Compass 等关键选项,并提供通过系统服务列表验证安装是否成功的方法,帮助开发者快速搭建本地 MongoDB 环境。
Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动
本文详解在 Linux 系统下安装 MongoDB 的完整流程,涵盖依赖包安装、二进制包下载解压、环境变量配置、数据与日志目录创建及服务启动验证。通过标准化命令与路径说明,帮助开发者快速完成部署并确认服务状态。
MacOS安装MongoDB完整教程
本文介绍在MacOS系统下安装MongoDB的完整流程,涵盖下载、解压、目录配置、环境变量设置及服务启动。通过明确的命令与参数说明,帮助开发者快速完成环境搭建并验证安装结果。
Ubuntu系统安装与配置Redis完整指南
本文详解在Ubuntu系统中安装Redis的两种主流方式:apt在线安装与源码编译安装。涵盖版本选择逻辑、服务启停与状态检查、连接验证方法,以及在线练习工具与桌面GUI客户端的对比与使用建议,帮助开发者快速搭建并验证Redis运行环境。
- 热门数据榜
相关攻略
2026-09-01 06:20
2026-09-01 06:20
2026-09-01 06:20
2026-09-01 06:19
2026-09-01 06:19
2026-09-01 06:19
2026-09-01 06:18
2026-09-01 06:18
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

