MySQL的执行流程
MYSQL的逻辑架构
3 层架构
- 客户层:负责的服务主要有:
- 管理连接:
PDBC
+JDBC
+ODBC
- 用户登录:
User
+Password
- 权限验证:
privileges
- 管理连接:
- 服务层:
词法分析
+语法分析
+·优化器
+执行器
- 负责实现跨存储引擎的功能
- 比如存储过程
procedure
, 触发器trigger
, 视图view
- 存储层:
插件式
的架构,支持InnoDB
,Memory
等
建立连接
- 尽量使用长连接
- 但也不能一直保持连接。
- 执行过程中临时使用的内存管理在连接对象里面
- 长连接会累积这些内存占用
- 定期断开长连接
mysql_reset_connection
可以重新初始化连接- 开销更小
Select
Select * from t where id = 1;
- 词法分析、语法分析
- 识别token:
关键字:Select
操作符:*
关键字:from
标识符:t
关键字:where
标识符:id
操作符:=
常量:1 - 语法分析:
根据语法规则,判断这个语句是否满足MySQL语法
- 识别token:
- 优化器:决定选择使用哪一个方案。
- 在表里面有多个索引的时候,决定使用哪个索引;
- 在一个语句有多表连接的时候,决定各个表的连接顺序。
- 执行器:开始执行语句
- 权限验证
- 打开表,根据表的引擎定义,使用对应的接口
- 到达存储引擎
- 调用InnoDB引擎接口取到t表的第一行,判断id是否为10
- 取下一行,重复相同的判断逻辑,知道取到这个表的末行
- 将目标的记录集作为结果集返回给客户端
Update
Write-Ahead Logging
:先写日志,再写磁盘。
涉及两个重要的日志模块。
- 重做日志
redo-log
- InnoDB引擎特有的日志,以插件形式引入
- 物理日志,记录“在某个数据页上做了什么修改”
- 在适当的时候,将操作记录更新到磁盘里面
有了
redo-log
,即使数据库异常重启,
之前提交的记录也不会丢失,这个特性叫做crash-safe
- 归档日志
bin-log
- Server层实现,只能用于归档。
- 逻辑日志,记录语句的原始逻辑
- 追加写入,不会覆盖以前的日志
两阶段提交
: 两阶段指的是重做日志的prepare
👉commit
为什么要有“两阶段提交”?
- 当重做日志写完时,归档日志一定也写完了,保证
一致