一、先明确 MySQL 核心架构:Server 层 + 存储引擎层
MySQL 的架构分为两大核心层,所有 SQL 语句的执行都会先经过 Server 层的统一处理,再由存储引擎层完成数据的实际存取:
- Server 层:是 MySQL 的核心,包含连接器、查询缓存(8.0 移除)、分析器、优化器、执行器等核心组件,还涵盖所有内置函数(如字符串、日期计算)、存储过程、触发器、视图等,跨存储引擎的功能都在这一层实现;
- 存储引擎层:负责数据的存储和提取(如 InnoDB、MyISAM、Memory 等),以插件形式存在,Server 层通过统一接口与存储引擎交互,最常用的是 InnoDB(MySQL 5.5.5 后默认)。
二、Server 层核心组件(执行链路的核心节点)
1、连接器:建立连接,验证身份(所有 SQL 执行的第一步)
当客户端发起 MySQL 连接请求时,首先与连接器交互:
- 核心动作 :
- 验证用户名 / 密码(错误则返回
Access denied,连接终止); - 验证通过后,查询该用户的权限(权限信息会缓存,后续整个连接周期内权限以本次查询为准,即使中途修改用户权限,当前连接也不受影响);
- 建立 TCP 连接,进入 "空闲状态"(可通过
show processlist看到Sleep状态的连接),客户端闲置超wait_timeout(默认 8 小时)则自动断开。
- 验证用户名 / 密码(错误则返回
- 关键作用:是客户端与 MySQL 交互的 "入口",负责连接管理、身份认证、权限缓存。
2、查询缓存:缓存查询结果(MySQL 8.0 已移除,仅作历史说明)
连接器建立连接后,若为查询语句(如SELECT),MySQL 8.0 之前会先查查询缓存:
- 核心逻辑:以 "查询语句字符串" 为 Key,查询结果为 Value,缓存到内存中;若缓存命中,直接返回结果,跳过后续分析 / 优化 / 执行步骤;若未命中,继续后续流程。
- 被移除的原因:缓存失效成本极高(只要表数据有更新,该表所有查询缓存都会清空),实际生产中(如频繁更新的业务表)缓存命中率极低,反而增加性能开销。
3、分析器:解析 SQL,判断 "语法是否合法 + 要做什么"
若跳过 / 未命中查询缓存,SQL 进入分析器,核心做 "词法分析" 和 "语法分析":
- 词法分析 :拆解 SQL 语句,识别关键词和元素。例如
SELECT id FROM user WHERE age = 18;,会识别出:这是SELECT查询语句,查询列是id,查询表是user,条件是age=18; - 语法分析 :校验 SQL 语法是否符合 MySQL 规范(如关键词拼写错误、缺少分号、表名 / 列名不存在等),若语法错误,返回
You have an error in your SQL syntax; - 关键输出:生成 "语法树"(描述 SQL 要执行的逻辑),传递给优化器。
4、优化器:选择最优执行方案
分析器确定 "要做什么" 后,优化器决定 "怎么做"------ 在多个可行的执行计划中选择成本最低的:
- 优化场景举例 :
- 多表关联查询(如
JOIN):决定表的连接顺序(先查小表还是大表); - 索引选择:若 WHERE 条件有多个索引可选,选择最优索引(如区分度高的索引);
- 执行计划优化:如是否使用覆盖索引、是否走全表扫描等。
- 多表关联查询(如
- 关键输出 :生成 "执行计划"(可通过
EXPLAIN查看),传递给执行器。
5、执行器:执行 SQL,与存储引擎交互
优化器生成执行计划后,执行器开始实际执行,核心步骤:
- 权限校验:再次校验当前用户对目标表 / 列的操作权限(避免连接器缓存权限后权限变更),无权限则返回错误;
- 调用存储引擎接口:根据执行计划,向存储引擎发起数据存取请求(如读取行、更新行);
- 处理结果 :
- 若为查询语句:遍历存储引擎返回的结果集,返回给客户端;
- 若为更新语句:执行数据修改,并触发事务日志(redo log/undo log)写入。
三、不同 SQL 语句的执行过程拆解
1、查询语句
完整链路:
客户端发起请求 → 连接器(建立连接+认证+权限缓存)→ 查询缓存(8.0跳过)→ 分析器(词法/语法分析→生成语法树)→ 优化器(选择索引/执行计划)→ 执行器(权限校验→调用InnoDB接口读取数据)→ 存储引擎(读取数据:走age索引→返回id)→ 执行器(整理结果)→ 返回客户端
- 执行器执行时,会逐行调用存储引擎的
next_row接口读取数据,直到满足条件的所有行都被读取完毕。
2、更新语句
更新语句比查询多了 "事务日志" 和 "持久化" 环节(基于 InnoDB),完整链路:
客户端发起请求 → 连接器(建立连接+认证+权限缓存)→ 分析器(解析UPDATE语句,确认目标表/列/条件)→ 优化器(选择id索引作为执行计划)→ 执行器(权限校验→调用InnoDB接口)→ 存储引擎(执行更新):
1. 加行锁(id=1的行,避免并发更新冲突);
2. 读取原数据(生成undo log,用于事务回滚);
3. 修改数据(内存中更新name字段);
4. 写入redo log(标记为"准备状态",保证崩溃恢复);
→ 执行器(触发binlog写入,记录更新逻辑)→ 存储引擎(将redo log标记为"提交状态",事务提交)→ 返回客户端"更新成功"
- WAL 机制:InnoDB 为了性能,更新时先写内存和 redo log(磁盘顺序写),而非直接刷磁盘,后续由后台线程异步将内存数据刷到磁盘(落盘),保证性能和数据可靠性。
四、总结
- 核心逻辑:所有 SQL 语句的执行都遵循 "连接→解析→优化→执行" 的核心流程,Server 层负责逻辑处理,存储引擎层负责数据存取,分层架构保证了功能解耦和扩展性;
- 查询 vs 更新:查询语句核心是 "读取数据",流程更简洁;更新语句需额外处理锁、事务日志(redo/undo log)、binlog,保证数据一致性和可恢复性;
- 关键组件 :
- 连接器:连接管理的基础;
- 分析器:保证 SQL "合法";
- 优化器:保证 SQL "高效";
- 执行器:保证 SQL "正确执行" 并与存储引擎交互;
- 存储引擎:保证数据 "安全存取"(事务、锁、索引等)。