了解 RDBMS的三大引擎模块|青训营笔记

85 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记

一条SQL语句首先会经过Parser解析成AST,然后经过Optimizer解析成Plan表,之后经过Executor将结果存储到文件中,并记录到日志,返回结果。

SQL引擎

  • Parser

    1. 词法分析(Lexical analysis),将关键词,表列名,运算符,常量等按不同类型提取出来
    2. 语法分析(Syntax ~),将提取出来的内容按格式形成语法树结构
    3. 语义分析(Semantic ~),校验表列是否存在,变量类型是否合法
  • Optimizer

    基于规则的优化(RBO),选取最优的路线

    • 条件简化,能用常量就替换变量,条件永True(False)就替换

    • 表连接优化,总是先选小表进行连接

    • Scan优化,索引优先级(从高到低)

      1. 唯一索引,就是索引对应的列有唯一约束
      2. 普通索引
      3. 全表扫描

    基于代价的优化(CBO),时间代价,IO,CPU,NET,MEM等

  • Executor

    火山模型,解耦合,多次函数调用导致CPU效率不高

    向量化,批处理计算,降低函数调用次数,利用CPU的SIMD机制,CPU cache命中率高

    编译执行,封装函数,LLVM动态编译技术

存储引擎

InnoDB

dev.mysql.com/doc/refman/…

Buffer Pool

位于内存,

分为多个instance,

instance分为多个chunk,chunk又有多个block组成

利用HashMap存储每个block

LRU算法

Page

16k,磁盘上按page存储

innoDB存储引擎中,常见的页类型有:

  1. 数据页(B-tree Node)
  2. undo页(undo Log Page)
  3. 系统页 (System Page)
  4. 事物数据页 (Transaction System Page)
  5. 插入缓冲位图页(Insert Buffer Bitmap)
  6. 插入缓冲空闲列表页(Insert Buffer Free List)
  7. 未压缩的二进制大对象页(Uncompressed BLOB Page)
  8. 压缩的二进制大对象页 (compressed BLOB Page)

B+ Tree

索引

事务引擎

Undo Log

逻辑日志,记录数据的增量变化,用于事务回滚,保证原子性

实现MVCC,解决读写冲突:读写互不阻塞,和一致性读(快照读):经常发生在mysqldump一致性备份期间。

保证一致性和隔离性

Redo Log

物理日志,记录页面的变化。如果数据写入故障,重启Mysql就是用它来重做恢复

保证事务的持久性

  • 事务提交前页面写盘
  • WAL(Write-ahead Logging)

保证隔离性,分为读写锁