Skip to content

一条查询语句如何执行

学习 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 有时快有时慢

  1. Buffer Pool 命中率不同,数据在内存中会比从磁盘读取快很多。
  2. 统计信息变化,优化器可能选择了不同索引。
  3. 事务锁等待,SQL 本身不慢,但被其他事务阻塞。
  4. 返回数据量变化,扫描和网络传输成本增加。
  5. 服务器资源竞争,CPU、IO、连接池都可能成为瓶颈。

学习建议

读执行流程时不要孤立记组件名。可以把每个慢 SQL 都放回这条链路里分析:先看连接和权限,再看执行计划,最后结合锁等待、Buffer Pool 和磁盘 IO 判断真正瓶颈。