这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
SQL执行过程
SQL引擎,事务引擎,存储引擎三部分
SQL引擎
Parser解析器
一般分为词法分析、语法分析、语义分析等步骤
主要是将SQL语句解析为机器可以识别的语言,并且检查SQL语句的合法性
Optimizer优化器
分析目前的执行方案,选择一种执行成本最小的方案进行执行
- 基于规则的优化(RBO),如下:
条件简化
表连接优化
Scan优化
- 基于代价的优化(CBO)
一种查询有多种执行方案,CBO会选择其中代价最低的方案执行
Executor执行器
- 火山模型:逐层调用,逐层返回
优点:每个算子独立抽象实现,相互不耦合,逻辑结构简单
缺点:每计算一条数据有多次函数调用开销,CPU利用率不高
- 向量化
批量返回
- 编译执行
将所有操作封装到一个函数里,函数调用的代价大幅度降低。
存储引擎---InnoDB
- Buffer Pool
结构如下
Buffer Pool分为多个instance,每个instance包含多个chunk,每个chunk占128M,用来管理页(16k大小)。防止访问页冲突
通过LRU算法进行页的淘汰
- Page
行格式:
变长字段列表:用来存储这一行中变长字段的长度,逆序存储的
NULL值标志位:用来存储这一行中值为NULL的列位置
roll_ptr:指向undo log版本链
Header:主要包含delete_mask、next_record、record_type
delete_mask:标志此条数据是否被删除,当这条数据被删除时并不是真正的被删除,而是逻辑删除。
next_record:下一条数据的位置
Page Header
一个页的结构
其中User Records就是记录真正的存储位置,当前页没有记录时,User Records是空的,当在此页添加一条记录时,会从Free Space分配空间给User Records,当Free Space没有空间时,表示此页不能再存储数据了。
Page Header和FIL Trailer都有校验的作用,保证任何情况下页的一致性。Page Header还有其他的作用,比如指向下一页,指向上一页等等。
- B+ Tree
特点:所有记录都在叶子节点,而且叶子节点之间是连接起来的,组成一个双向链表。
事务引擎
- Atomicity原子性 与 Undo log
原子性主要靠Undo log来保证,若事务执行中出现异常,利用Undo log将数据库回退到之前的状态
Undo log是逻辑日志,记录的是数据的增量变化。利用Undo log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制,解决读写冲突和一致性读的问题。
- Isolation 与 锁
隔离性:各个事务之间相互独立,不会被互相干扰。
- Durability 与 Redo Log
持久性主要靠Redo log来保证,当数据库在写入数据之前出现宕机,重启mysql后会根据Redo Log进行恢复
Redo log是物理日志,记录的是页面的变化,