这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
RDBMS关键技术 | 青训营笔记
发展历史
一条SQL的一生
- 数据库接受到SQL后先用语法解析其解析语句
- 语法解析器生成语法树给优化器
- 优化器生成plan tree给执行器
- 执行器从数据文件中进行读写,最后返回给用户
SQL引擎
语法解析器
一般分为词法分析,语法分析,语义分析等步骤
优化器
为什么需要优化器?
白话理解:类似于路径规划,选择一种最优的查询方式查询
基于规则的优化(RBO Rule Base Optimizer)
- 条件化简
- 小表先进行连接
- Scan优化
- 基于唯一索引
- 基于普通索引
- 全表扫描 数据库索引是数据库管理系统中辅助数据结构,以协助快速查询更新数据库表中的数据。目前数据库中最常用的索引是B+树实现的。
基于代价的优化(CBO Cost Base Optimizer)
什么是代价?
时间、IO、CPU、NET、MEM
执行器
火山模型
每个Operator调用next操作,访问下层Operator,偶的下层Operator返回的一行数据,经过计算后将这行数据返回给上层。
优点
每个算子独立抽象实现,相互之间没有耦合
缺点
每计算一条数据有多次函数调用开销,导致CPU效率不高
火山模型用的最多的一种模型,在此基础上发展出向量化、编译执行等其他模型
向量化是每次计算一批数据,返回一批
编译执行是把所有操作封装到一个函数里面,使用动态编译技术
存储引擎 - 以InnoDB为例
Buffer Pool
Buffer分为多个instance,每个instance分为多个chunk,每个chunk分为多个page
Page
directory:二分查找+很短的遍历
B+树
范围查找,找到节点后可以利用双向链表,横向遍历
事务引擎
数据库状态回退
Isolation与MVCC
MVCC的意义
- 读写互不阻塞
- 降低死锁概率
- 实现一致性读 多版本数据存储,链式连接,新版本存在Record,老版本存在undo
持久化
问题
- 随机IO效率低
- 写放大:只要写很少的数据,但是得把整个page(16kB)写进去
方案:Write-ahead logging
物理日志,记录了页面变化,先把日志写盘,日志写盘后代表事务提交。如果数据还没写进去就宕机,重启后会根据redo log恢复数据