RDBMS | 青训营笔记

94 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天,今天学习了RDBMS,最后MySQL的事务引擎部分很有启发,把一些零碎的知识点串起来了,有收获。

RDBMS(关系型数据库)

发展

graph LR
人工管理 --> 文件系统 --> DBMS出现
网状模型层次模型关系模型
关系多对多1对多多对多
结构二维表
特点存取效率高查询效率高
劣势结构复杂遍历复杂关联查询效率低

SQL

结构化查询语言,高度非过程化

关键技术

SQL过程

解析器:SQL引擎

词法分析:找关键字、列名、常量、运算符
语法分析:根据关键词形成语法树
语义分析:合法性检查

优化器

RBO:基于规则的优化,比如表连接,小表先连接
CBO:基于代价的优化,以时间为标杆

执行器

火山模型,operator逐层向下调用,最后反方向返回结果row。好处是算子没有耦合,逻辑简单;坏处是函数开销大。
向量化模型,每次返回一批batch(N row)数据,函数调用次数降低为1/N。
编译执行模型,强耦合,减少函数开销。可利用动态编译技术,动态生成代码。

存储引擎

image.png

  1. In-memory数据缓存:log buffer,buffer pool
  2. On-disk数据:system table元数据,general table,log

Buffer pool

以chunk128MB申请内存,chunk分为若干大小16KB页面, 重要的数据结构,如hashmap<page_id, block>,lru_replacer。

page结构

变长字段列表NULL值标志位Headerrow_idtrx_idroll_ptrCOL1...COLN

b+树

数据只存叶子节点

事务引擎

一致性支持:undo log

undo log是逻辑日志,记录数据增量变化;undo log可以事务回滚

隔离性支持:MVCC

读写互不阻塞
undolog的每个事务由事务ID,roll_ptr将数据快照连接起来 image.png

持久化支持:redo log

利用了WAL技术, redo log是物理日志,记录页面变化,可实现持久化,数据写入磁盘前发生故障,重启mysql后可根据redo log重做。

可实现