一、连接管理器:连接建立与权限认证的门卫
当客户端发起连接请求时,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 的查询流程远非黑箱,真正的性能优化来自理解每一环节的职责与运行机制。掌握这套执行链条,是成为高阶开发者、DBA 的关键一步。
以上源码文件🔗 GitHub 链接:
https://github.com/mysql/mysql-server