RDBMS关键技术 | 青训营笔记

96 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 30 天

1. 一条SQL语句的一生

image.png

  • SQL引擎:Parser,Optimizer,Executor

    • 查询解析:SQL语言接近自然语言,入门容易。但是各种关键字、操作符组合起来,可以表达丰富的语义。因此想要处理SQL命令,首先将文本解析成结构化数据,也就是抽象语法树AST
    • 查询优化:SQL是一门表意的语言,只是说要做什么,而不说怎么做。所以需要一些复杂的逻辑选择如何拿数据,也就是选择一个好的查询计划。优化器的作用是根据AST优化产生最优执行计划Plan Tree
    • 查询执行:根据查询计划,完成数据读取,处理,写入等操作
  • 事务引擎:未显示

    • 事务引擎:处理事务一致性、并发、读写隔离等
  • 存储引擎:Data File,Log File

    • 存储引擎:内存中的数据缓存区,数据文件,日志文件等

2. SQL引擎

2.1 SQL引擎 - Parser

解析器Parser一般分为词法分析(Lexical analysis)、词法分析(Syntax analysis)、语义分析(Semantic analysis)等步骤

image.png

  • 词法分析:将一条SQL语句对应的字符串分割为一个个token,这些token可以简单分类
  • 语法分析:把词法分析的结果转化为语法树。根据token序列匹配不同的语法规则,比如这里匹配的是update语法规则,类似还有insert、delete、select、create、drop等语法规则。根据语法规则匹配SQL语句中的关键字,最终输出一个结构化的数据结构
  • 语法分析:对语法树中的信息合法性校验

2.2 SQL引擎 - Optimizer

image.png

基于规则的优化RBO

image.png

基于代价的优化CBO

image.png

2.3 SQL引擎 - Executor

Plan Tree为基础
调用关系是由根到叶 数据流是叶到根 image.png Projection,Filter,Scan称为算子(Operator)

image.png 向量化执行更适合大批量数据处理,对于很多单行数据没有优势。而且往往搭配列式存储使用

image.png LLVM动态编译执行技术,根据优化器产生的计划,动态的生成执行代码

3. 存储引擎

3.1 存储引擎 - InnoDB

image.png

3.2 存储引擎 - Buffer Pool

image.png

  • Mysql中每个chunk的大小一般为128M,每个Block对应一个Page,一个chunk下面有8192个block。这样可以避免内存碎片化
  • 分成多个instance,可以有效避免并发冲突
  • Page id % instance num得到它属于那个instance

image.png

  • 当Buffer pool里面的页面都被使用后,需要换存其他的页面怎么办?淘汰已有的页面
    淘汰规则:淘汰最近一段时间最少被访问过的缓存页,这种思想就是典型的LRU算法
  • MYSQL在LRU上进行了优化,优化思路是:对数据进行冷热分离,将LRU链表分成两部分,一部分用来存放冷数据,也就是刚从磁盘读进来的数据,另一部分用来存放热点数据,也就是经常被访问到的数据
  • 当从磁盘读取数据页后,会先将数据页存放到LRU链表冷数据区的头部,如果这些缓存页在1s之后被访问,那么就将缓存也移动到热数据区的头部;如果是1s内被访问,则不移动,缓存也仍处于冷数据区

3.3 存储引擎 - Page

image.png

3.4 存储引擎 - B+ Tree

image.png

4. 事务引擎

image.png

4.1 事务引擎 - Atomicity & Undo Log

image.png 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发现错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
需要记录修改前的状态,以便在事务失败时进行回滚
undo log是逻辑日志,记录的是数据的增量变化,它的作用是保证事务的原子性和事务的并发控制。可以用于事务回滚,以及提供多版本机制(MVCC),解决读写冲突和一致性读的问题

4.2 事务引擎 - Isolation & 锁

image.png Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读取和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据不一致
如果多个并发事务访问同一行记录,就需要锁来保证了。
MVCC机制解决读写冲突

4.3 事务引擎 - Isolation & MVCC

image.png

4.4 事务引擎 - Durability & Redo Log

image.png 持久化:事务处理结束后,对数据的修改是永久性的,即使系统故障也不会丢失
WAL:修改并不直接写入到数据库中,而是写入到另一个被称为WAL文件中;如果事务失败,WAL中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改
优点:
只记录增量变化,没有写放大
Append only,没有随机IO