一条查询语句如何执行
学习 MySQL 时,最重要的主线之一是理解一条 SQL 从客户端发出后,数据库内部做了哪些事情。只有知道执行链路,排查慢 SQL、连接异常和索引失效时才不会只凭感觉。
执行流程
mermaid
flowchart TD
A[客户端发送 SQL] --> B[连接器校验账号和权限]
B --> C[解析器做词法语法分析]
C --> D[预处理器检查表和字段]
D --> E[优化器选择执行计划]
E --> F[执行器调用存储引擎]
F --> G[InnoDB 读取数据页]
G --> H[返回结果给客户端]各组件职责
| 组件 | 作用 | 排查重点 |
|---|---|---|
| 连接器 | 建立连接、认证、维护会话状态 | 连接数、权限、超时 |
| 解析器 | 判断 SQL 语法是否合法 | 语法错误、关键字冲突 |
| 优化器 | 决定表连接顺序和索引选择 | 执行计划、统计信息 |
| 执行器 | 按执行计划读取和过滤数据 | 扫描行数、返回行数 |
| 存储引擎 | 真正访问数据和索引 | Buffer Pool、锁、IO |
为什么同一条 SQL 有时快有时慢
- Buffer Pool 命中率不同,数据在内存中会比从磁盘读取快很多。
- 统计信息变化,优化器可能选择了不同索引。
- 事务锁等待,SQL 本身不慢,但被其他事务阻塞。
- 返回数据量变化,扫描和网络传输成本增加。
- 服务器资源竞争,CPU、IO、连接池都可能成为瓶颈。
学习建议
读执行流程时不要孤立记组件名。可以把每个慢 SQL 都放回这条链路里分析:先看连接和权限,再看执行计划,最后结合锁等待、Buffer Pool 和磁盘 IO 判断真正瓶颈。
