这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天,今天学习了RDBMS,最后MySQL的事务引擎部分很有启发,把一些零碎的知识点串起来了,有收获。
RDBMS(关系型数据库)
发展
graph LR
人工管理 --> 文件系统 --> DBMS出现
| 网状模型 | 层次模型 | 关系模型 | |
|---|---|---|---|
| 关系 | 多对多 | 1对多 | 多对多 |
| 结构 | 图 | 树 | 二维表 |
| 特点 | 存取效率高 | 查询效率高 | |
| 劣势 | 结构复杂 | 遍历复杂 | 关联查询效率低 |
SQL
结构化查询语言,高度非过程化
关键技术
SQL过程
解析器:SQL引擎
词法分析:找关键字、列名、常量、运算符
语法分析:根据关键词形成语法树
语义分析:合法性检查
优化器
RBO:基于规则的优化,比如表连接,小表先连接
CBO:基于代价的优化,以时间为标杆
执行器
火山模型,operator逐层向下调用,最后反方向返回结果row。好处是算子没有耦合,逻辑简单;坏处是函数开销大。
向量化模型,每次返回一批batch(N row)数据,函数调用次数降低为1/N。
编译执行模型,强耦合,减少函数开销。可利用动态编译技术,动态生成代码。
存储引擎
- In-memory数据缓存:log buffer,buffer pool
- On-disk数据:system table元数据,general table,log
Buffer pool
以chunk128MB申请内存,chunk分为若干大小16KB页面, 重要的数据结构,如hashmap<page_id, block>,lru_replacer。
page结构
| 变长字段列表 | NULL值标志位 | Header | row_id | trx_id | roll_ptr | COL1 | ... | COLN |
|---|
b+树
数据只存叶子节点
事务引擎
一致性支持:undo log
undo log是逻辑日志,记录数据增量变化;undo log可以事务回滚
隔离性支持:MVCC
读写互不阻塞
undolog的每个事务由事务ID,roll_ptr将数据快照连接起来
持久化支持:redo log
利用了WAL技术, redo log是物理日志,记录页面变化,可实现持久化,数据写入磁盘前发生故障,重启mysql后可根据redo log重做。
可实现