Server 层和存储引擎层分工
为什么需要分层
MySQL 将逻辑处理和数据存储分开,Server 层负责”做什么”,引擎层负责”怎么做”。这种设计让 MySQL 能够灵活支持多种存储引擎,是它最大的架构优势之一。
分工边界
graph LR
subgraph Server层
A[连接管理]
B[权限校验]
C[SQL解析]
D[优化器]
E[执行器]
end
subgraph 存储引擎层
F[数据读写]
G[索引维护]
H[事务管理]
I[锁管理]
J[崩溃恢复]
end
E --> F
Server 层负责
| 功能 | 说明 |
|---|---|
| 连接管理 | 线程处理、连接池管理 |
| 权限校验 | 验证用户是否有操作权限 |
| SQL 解析 | 词法分析、语法分析 |
| 查询优化 | 索引选择、连接顺序优化、执行计划生成 |
| 缓存 | 查询缓存(8.0 前)、预编译语句缓存 |
| 内置函数 | 字符串、日期、数学、聚合函数等 |
| 日志管理 | binlog、慢查询日志、通用日志 |
存储引擎层负责
| 功能 | 说明 |
|---|---|
| 数据读写 | 实际数据的存取操作 |
| 索引实现 | B+树、哈希索引等数据结构的维护 |
| 事务支持 | ACID 特性的实现(InnoDB) |
| 锁管理 | 行锁、表锁、间隙锁等 |
| 崩溃恢复 | redo log、undo log 实现故障恢复 |
| 物理存储 | 数据页、数据文件的管理 |
一条 UPDATE 语句的分工
UPDATE user SET age = age + 1 WHERE id = 100;
Server 层做的:
1. 连接器校验权限
2. 分析器解析 SQL
3. 优化器选择索引(id 主键)
4. 执行器调用引擎接口,获取 id=100 的行
引擎层做的:
1. InnoDB 定位 id=100 的数据页
2. 将数据页加载到 Buffer Pool
3. 修改 age 字段
4. 写入 undo log(用于事务回滚)
5. 写入 redo log(Prepare 阶段)
6. Server 层写入 binlog
7. InnoDB 将 redo log 标记为 Commit(两阶段提交)
核心区别
-- Server 层特性:所有引擎通用
SELECT VERSION(); -- 内置函数
SELECT COUNT(*) FROM t; -- 聚合函数(Server 层会逐行读取)
-- 引擎层特性:各引擎不同
-- InnoDB 支持事务
START TRANSACTION;
UPDATE t SET x = 1 WHERE id = 1;
COMMIT;
面试要点
- 两阶段提交:redo log 和 binlog 的一致性由 Server 层协调
- 索引本质在引擎层实现:Server 层不知道索引具体怎么存储
- COUNT(*) 行为差异:MyISAM 单独维护行数,InnoDB 需要实际扫描(有辅助优化)
一句话总结:Server 层是做”决策”的,引擎层是做”执行”的,两者通过统一的存储引擎接口协作。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容