一条 SQL 到底是怎么执行的?MySQL 查询流程全景讲解

一、连接管理器:连接建立与权限认证的门卫

当客户端发起连接请求时,MySQL 会通过连接管理器模块处理:

🔍 核心过程:

认证阶段

  • 基于用户名、密码、主机地址等进行身份校验;

  • 利用 mysql.user 表中的加密方式(如 Caching SHA2)进行比对;

权限检查

  • 连接成功后,对每条 SQL 进行权限验证(库、表、列、函数粒度);

  • 权限保存在内存缓存中,调用 check_access() 进行快速匹配。

🧠 底层实现参考:

源码文件:sql/sql_acl.cc

关键函数:acl_authenticate()、check_table_access()

⚠️ 常见问题:

用户配置过宽导致数据泄露;

忘记刷新权限(需执行 FLUSH PRIVILEGES);


二、解析器:词法与语法的双重分析

🔍 核心过程:

词法分析(Lexing):

  • 将原始 SQL 字符串拆解为 Token 流;

  • 例如:SELECT * FROM user 分解为关键字、标识符、操作符等;

  • 使用 LALR(1) 编译器生成器工具(如 bison, flex)构建;

语法分析(Parsing):

  • 构建语法树(AST),并识别结构如 SELECT、WHERE、JOIN 等;

  • 检查语法合法性,捕捉语法错误或 SQL 注入特征;

  • 最终生成 Parse Tree 用于后续优化器阶段。

🧠 底层实现参考:

源码目录:sql/sql_parse.cc、sql_yacc.yy

关键结构体:THD, LEX, SELECT_LEX


三、查询优化器:SQL 性能的核心分水岭

优化器决定了“怎么执行 SQL”,哪种路径最优。

🔍 核心任务:

  • 选择最优的索引(覆盖索引 vs 聚簇索引);

  • 确定多表连接顺序(Join Order);

  • 评估是否使用临时表、排序等操作;

🔬 关键组件:

代价估算模型(Cost Model):

  • 使用行数估算(cardinality)+ I/O 次数 + CPU 代价等;

  • 信息来源于表统计信息(ANALYZE TABLE、innodb stats);

Join优化

  • 基于启发式或动态规划构建多个 Join 计划;

  • 选择总代价最低的一条路径执行。

🧠 底层实现参考:

源码文件:sql/opt_range.cc、sql/sql_select.cc

关键函数:make_join_plan(), optimize_join()

⚠️ 常见问题:

表统计信息不准 → 错选执行路径;

未命中索引 → 全表扫描(查看 EXPLAIN 的 type 字段)


四、执行器:指挥官角色,逐条调度操作

优化器给出“路线图”,执行器负责真实调度执行

🔍 核心职责:

  • 初始化执行上下文(如内存结构、临时表);

  • 根据优化计划调用具体操作;

  • 控制执行阶段如:取记录、过滤、排序、聚合等;

  • 将处理结果写入客户端缓冲区并返回。

🧠 底层实现参考:

源码文件:sql/sql_executor.cc

执行阶段:JOIN::exec()、QEP_TAB::read_record()、send_result_set_row()


五、存储引擎:InnoDB 的数据读取过程详解

MySQL 执行器会调用具体的存储引擎,InnoDB 是默认首选。

🔍 读取流程:

B+ 树查找

  • 二级索引先定位主键 → 回表查聚簇索引;

Buffer Pool 缓存机制

  • 如果页已在内存中,直接读取;

  • 否则触发物理 I/O,从磁盘加载至 Buffer Pool;

MVCC 控制版本可见性

  • 使用 Undo Log 和事务版本号判断当前事务是否可见;

  • 默认隔离级别为 REPEATABLE READ;

🧠 底层实现参考:

源码模块:storage/innobase/row/row0sel.cc

核心结构体:buf_pool_t, trx_t, mtr_t, read_view_t

⚠️ 常见问题:

回表过多导致性能下降;

数据页不命中缓存频繁磁盘 I/O;


六、结果返回:分批响应客户端结果集

🔍 关键机制:

  • MySQL 会将结果集拆分为多个数据包(Packet);

  • 每次响应受限于 max_allowed_packet 参数;

  • 支持客户端流式读取(如 JDBC 的 ResultSet);

⚠️ 常见问题:

大字段(如 TEXT/BLOB)超出 packet 限制;

网络带宽或连接数瓶颈影响返回速度;


七、预处理与重写机制

🔍 重要补充:

  • 预处理器会展开视图、替换别名、合并子查询;

  • 重写插件支持基于规则自动改写查询(适用于规范统一);


八、推荐排查工具与优化手段

工具一览:

工具

作用

EXPLAIN

查看优化器生成的执行计划

SHOW PROFILE

分析 SQL 各阶段耗时

SHOW STATUS LIKE 'Handler%'

了解读取行为

INFORMATION_SCHEMA.PROFILING

每步耗时统计


九、整体流程图概要

MYSQL执行流程图.drawio.png


🔚 结语:了解内部机制,是优化的基础

MySQL 的查询流程远非黑箱,真正的性能优化来自理解每一环节的职责与运行机制。掌握这套执行链条,是成为高阶开发者、DBA 的关键一步。

以上源码文件🔗 GitHub 链接:

https://github.com/mysql/mysql-server

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小健学 Java

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值