这是我参与「第五届青训营」笔记创作活动的第16天
1 ACID
通过抖音红包雨的案例,介绍 RDBMS 中 ACID 的概念:
- 原子性(Atomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
- 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
- 持久性(Durability):在事务完成以后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。
2 发展历史
2.1 网状模型
定义: 用有向图表示实体和实体之间的联系的数据结构模型称为网状数据模型。
其实,网状数据模型可以看做是放松层次数据模型的约束性的一种扩展。网状数据模型中所有的节点允许脱离父节点而存在,也就是说说在整个模型中允许存在两个或多个没有根节点的节点,同时也允许一个节点存在一个或者多个的父节点,成为一种网状的有向图。因此节点之间的对应关系不再是1:n,而是一种m:n的关系,从而克服了层次状数据模型的缺点。
特征:
1. 可以存在两个或者多个节点没有父节点;
2. 允许单个节点存在多于一个父节点;
网状数据模型中的,每个节点表示一个实体,节点之间的有向线段表示实体之间的联系。网状数据模型中需要为每个联系指定对应的名称。
2.2 层次模型
定义: 层次数据模型是用树状<层次>结构来组织数据的数据模型。
其实层次数据模型就是的图形表示就是一个倒立生长的树,由基本数据结构中的树(或者二叉树)的定义可知,每棵树都有且仅有一个根节点,其余的节点都是非根节点。每个节点表示一个记录类型对应与实体的概念,记录类型的各个字段对应实体的各个属性。各个记录类型及其字段都必须记录。
特征: 树的性质决定了树状数据模型的特征
1. 整个模型中有且仅有一个节点没有父节点,其余的节点必须有且仅有一个父节点,但是所有的节点都可以不存在子节点;
2. 所有的子节点不能脱离父节点而单独存在,也就是说如果要删除父节点,那么父节点下面的所有子节点都要同时删除,但是可以单独删除一些叶子节点;
3. 每个记录类型有且仅有一条从父节点通向自身的路径;
2.3 关系模型
关系型数据模型对应的数据库自然就是关系型数据库了,这是目前应用最多的数据库。
定义: 使用表格表示实体和实体之间关系的数据模型称之为关系数据模型。
关系型数据库是目前最流行的数据库,同时也是被普遍使用的数据库,如MySQL就是一种流行的数据库。支持关系数据模型的数据库管理系统称为关系型数据库管理系统。
特征:
1. 关系数据模型中,无论是是实体、还是实体之间的联系都是被映射成统一的关系---一张二维表,在关系模型中,操作的对象和结果都是一张二维表;
2. 关系型数据库可用于表示实体之间的多对多的关系,只是此时要借助第三个关系---表,来实现多对多的关系,如下例子中的学生选课系统中学生和课程之间表现出一种多对多的关系,那么需要借助第三个表,也就是选课表将二者联系起来;
3. 关系必须是规范化的关系,即每个属性是不可分割的实体,不允许表中表的存在;
3 关键技术
3.1 sql执行流程
在SQL执行过程中,需要经历SQL引擎、存储引擎、以及事务引擎等模块。而其中SQL引擎又分为Parser、Optimizer、Executor几个部分:
3.2 SQL 引擎
SQL引擎包括了:
-
Paser:经过词法分析、语法分析生成语法树,然后对语法树进行合法性校验。
-
Optimizer:根据Parser产生的语法树,根据规则或者代价产生执行计划树。
-
Executor:根据计划树进行执行,常见的执行方式是火山模型。
3.3 paser
SQL Parser 包含词法解析(Lexer)和语法解析(Parser),词法解析的作用是把一个 SQL 分割成一个一个不可分割的单元,例子:
原始 SQL:select id,name from table1 where name="xxx";
词法解析器输入是原始 SQL,并且暴露一个接口 nextToken(),每次调用 nextToken()都会返回一个 Token。
语法分析器的作用是使用 Lexer 的输出(调用 nextToken()),构造出 AST。
3.4 存储引擎
存储引擎负责了数据的底层存储、管理和访问工作。各大RDBMS存储引擎的设计都有不少的差异,这里选择MySQL的InnoDB存储引擎来向大家做一个介绍:
-
Buffer Pool:存储引擎位于内存中的重要结构,用于缓存数据,减少磁盘IO的开销。
-
Page:数据存储的最基本单位,一般为16KB。
-
B+u Tree:InnoDB中最常用的索引结构。
3.5 事务引擎
事务引擎实现了数据库的ACID能力,这里还是以MySQL的InnoDB为例来介绍数据库内部是通过哪些技术来实现ACID:
- Atomicity:InnoDB中通过undo日志实现了数据库的原子性,通过Undo Log,数据库可以回滚到事务开始的状态;
- Isolation:通过Undo Log实现MVCC(多版本并发控制),降低读写冲突。
- Durability:通过Redo Log(一种WAL实现方式)来保证事务在提交后一定能持久化到磁盘中。
- Consistency:一致性本质上是一种业务层的限制。