这是我参与「第五届青训营 」伴学笔记创作活动的第15天。
RDBMS基本情况
RDBMS发展历史
前DBMS时代:
人工管理->文件系统
DBMS时代:
根据数据模型的特点可以将传统数据库系统划分为网状数据库、层次数据库与关系数据库三类。
网状数据库:网状数据库基于网状数据模型建立的数据之间的联系,能够反映现实世界中信息的关联,是许多空间对象的自然表达形式。
层次数据库:世界上第一个层次数据库——信息管理系统诞生于IBM公司,这是世界上第一个大型商用数据库。层次数据模型,即使用树形结构来描述实体及其之间关系的数据模型。
DBMS的数据模型
网状模型:
优势:
- 能够直接描述现实世界;
- 存取效率较高;
劣势:
- 结构负责;
- 用户不易使用;
- 访问程序设计复杂;
层次模型:
优势:
- 结构简单;
- 查询效率较高;
- 可以提供较好的完整性支持;
劣势:
- 无法表示M:N的关系;
- 插入、删除的限制很多;
- 遍历子节点必须经过父节点;
- 访问程序设计的很复杂;
关系模型:
优势:
- 实体及实体间的联系都通过二维表结构表示;
- 可以方便的表示M:N的关系;
- 数据访问路径对用户透明;
劣势:
- 关联查询效率不够高;
- 关系必须规范化;
关键技术
SQL的执行流程:
首先用户从终端发起request,发送给路由,路由将SQL语句发送给RDBMS,RDBMS把SQL发送给Parser,Parser将AST发送给Optimizer,Optimizer将Plan发送给Executor,Executor从Data File中读取数据。
其中Parser、Optimizer、Executor都是SQL引擎。
SQL引擎
解析器(Parser)一般分为词法分析(Lexical analysis)、语法分析(Syntax analysis)、语义分析(Semantic analyzer)等步骤。
优化器(Optimizer)
基于规则的优化(RBO Rule Base Optimizer)进行条件化简、表连接优化、Scan优化。
数据库索引:是数据库管理系统中辅助数据结构,以协助快速查询、更新数据库中的数据。目前数据库中最常用的索引是通过B+树实现的。
基于代价的优化(CBO Cost Base Optimizer)一个查询有多种执行方案,CBO会选择其中代价最低的方案去真正的执行。
执行器(Executor)
火山模型:每个Operator调用Next操作,访问下层Operator,获得下层Operator返回的一行数据,在经过计算之后,将这行数据返回给上层。
优点:每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单。
缺点:每计算一条数据有多次函数调用开销,导致CPU效率不高。
存储引擎
InnoDB
在内存中,有缓冲池,改变缓冲,带有自适应哈希索引,日志缓冲区。
在磁盘中,有系统表空间、通用表空间、取消表空间、临时表空间以及重做日志。
Buffer Pool
通过HashMap实现Buffer Pool。
使用Last Recently Use进行内存与磁盘中内容的替换。
数据库数据在页面上是以page的形式存储。
page结构如下:
-
delete_mask:标识此条数据是否被删除。
-
next_record:下一条数据的位置。
-
record_type:标识当前记录的类型。
Page Header User Records Free Space Page Directory FIL Trailer
B+Tree
在页面内:
页目录使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快读找到指定的记录。 从根到叶:使用中间节点存储。
事务引擎
Undo日志
Undo log是逻辑日志,记录的是数据的增量变化,利用Undo Log可以进行事务的回滚,从而保证了事务的原子性。同时也实现了多版本并发控制(MVCC),解决读写冲突和一致性读的问题。
MVCC的意义:
- 读写互不阻塞;
- 降低死锁概率;
- 实现一致性读;
Durability与Read Log
采用在写入之前记录日志的方式保证数据修改的永久化保存。
WAL(Write-ahead logging)
redo log是物理日志,记录的是页面的变化,它的作用是保证事务持久化。如果数据写入磁盘前发生故障,重启MySQL后会根据redo log重做。