Server 层和存储引擎层分工

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
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容