这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
一条SQL语句首先会经过Parser解析成AST,然后经过Optimizer解析成Plan表,之后经过Executor将结果存储到文件中,并记录到日志,返回结果。
SQL引擎
-
Parser
- 词法分析(Lexical analysis),将关键词,表列名,运算符,常量等按不同类型提取出来
- 语法分析(Syntax ~),将提取出来的内容按格式形成语法树结构
- 语义分析(Semantic ~),校验表列是否存在,变量类型是否合法
-
Optimizer
基于规则的优化(RBO),选取最优的路线
-
条件简化,能用常量就替换变量,条件永True(False)就替换
-
表连接优化,总是先选小表进行连接
-
Scan优化,索引优先级(从高到低)
- 唯一索引,就是索引对应的列有唯一约束
- 普通索引
- 全表扫描
基于代价的优化(CBO),时间代价,IO,CPU,NET,MEM等
-
-
Executor
火山模型,解耦合,多次函数调用导致CPU效率不高
向量化,批处理计算,降低函数调用次数,利用CPU的SIMD机制,CPU cache命中率高
编译执行,封装函数,LLVM动态编译技术
存储引擎
InnoDB
Buffer Pool
位于内存,
分为多个instance,
instance分为多个chunk,chunk又有多个block组成
利用HashMap存储每个block
LRU算法
Page
16k,磁盘上按page存储
innoDB存储引擎中,常见的页类型有:
- 数据页(B-tree Node)
- undo页(undo Log Page)
- 系统页 (System Page)
- 事物数据页 (Transaction System Page)
- 插入缓冲位图页(Insert Buffer Bitmap)
- 插入缓冲空闲列表页(Insert Buffer Free List)
- 未压缩的二进制大对象页(Uncompressed BLOB Page)
- 压缩的二进制大对象页 (compressed BLOB Page)
B+ Tree
索引
事务引擎
Undo Log
逻辑日志,记录数据的增量变化,用于事务回滚,保证原子性
实现MVCC,解决读写冲突:读写互不阻塞,和一致性读(快照读):经常发生在mysqldump一致性备份期间。
保证一致性和隔离性
Redo Log
物理日志,记录页面的变化。如果数据写入故障,重启Mysql就是用它来重做恢复
保证事务的持久性
- 事务提交前页面写盘
- WAL(Write-ahead Logging)
锁
保证隔离性,分为读写锁