架构
约 568 字大约 2 分钟
2025-01-15
1.MySQL分层
MySQL从上到下可分为系统服务层、存储引擎层、以及文件系统层
- 服务层:连接器、解析器、预处理器、优化器、以及执行器
- 引擎层:InnoDB、MyISAM
- 系统层:涵盖所有日志、数据、以及索引文件
2.查询语句的执行流程
- 连接管理:客户端连接管理
- 查询缓存: 在MySQL8.0之前,检查是否有缓存数据
- 解析: 解析器对SQL语句进行词法和语法分析,将SQL语句分解成词元,构建解析树
- 预处理: 预处理器检查表和字段是否存在,验证用户权限
- 优化: 优化器选择合适索引、优化多表连接顺序,生成最优执行计划
- 执行: 根据执行计划,调用存储引擎接口,存储引擎负责数据读取和返回
- 返回结果: 返回给客户端
3.更新语句的执行流程
更新语句的执行流程分为两个过程:
- 第一阶段(准备阶段)
- 查询缓存池是否存在待更新的数据,不存在则将需要更新的数据页从磁盘加载到缓冲池
- 将旧数据记录到undo log中,用于事务回滚
- 在缓存池中更新数据
- 将修改记录写入 redo log,并写入prepare标志,此时准备事务完成
- 将更新sql语句写入bin log,把bing log写入磁盘
- 第二阶段(提交阶段)
- 在redo log中写入commit标记
- 返回客户端更新成功消息
补充:为什么写入redo log要分成两个阶段,prepare和commit?
- 第一阶段中,写入redo log和bin log两个日志的过程,如果写了redo log日志后,出现数据库宕机,会出现redo和binlog日志不一致的情况
- 即使写入redo log和bin log后,也不能保证redo和binlog日志是一样的。这就会导致了数据不一致的问题。而commit就是保证连个日志数据一致,事务才算提交成功。
4.MySQL的一行数据存储
待写