这是我参与「第五届青训营 」伴学笔记创作活动的第 17 天
RDBMS
基本介绍
什么是事务与ACID?
-
什么是事务?
事务(Transaction)是由一组SQL语句组成的一个程序执行单元(Unit),它需要满足ACID的特性。
BEGIN; UPDATE XXX SET XXX = XXX WHERE XXX; UPDATE YYY SET YYY = YYY WHERE YYY; COMMIT; -
什么是ACID?
-
Atomic:原子性,即事务是一个不可再分的工作单元,事务中的操作要么全部完成,要么都不发生。
例如转账过程,扣款与增加必须同时发生。
-
Consistency:数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
更多是指业务上逻辑的合法性。
-
Isolation:隔离性,多个事务并发访问时,一个事务不应该影响其他事务的运行结果。
两个操作同时进行时不应当互相影响,对外表现应该与串行操作一致。
-
Durability:持久性,在事务完成后,该事务对数据库所作更改应持久地保存到数据库中,而不会被回滚。
操作应该写到磁盘上。
-
DBMS发展史
-
前DBMS时代
人工管理:从结绳记事到打孔机
文件系统:1956年IBM发布了第一个磁盘驱动器,数据管理通过文件系统来存储
-
DBMS时代
1960s时文件系统以及不能满足数据管理的需要,因此出现了数据库管理系统DBMS。
DBMS:按照某种数据模型来组织,存储和管理数据的仓库。
可以按照数据模型将传统的数据库系统分为如下三类:
- 网状数据库
- 层次数据库
- 关系型数据库
SQL语言
结构化查询语言,是一种非过程化的查询语言。
:语法风格接近自然语言
:高度非过程化
:面向集合的操作方式
:语法简单易学
SQL的关键技术
一条SQL语句是如何执行的?
当一条SQL语句发送到RDBMS后,需要经过如下一些处理过程:
-
Parser:
- 解析SQL语句
- 生成语法树AST
-
Optimizer:
- 解析AST
- 生成执行计划Plan
-
Executor:
- 根据执行计划Plan
- 读写文件;写入日志;返回数据
SQL引擎
Parser
解析器与其他语法解析的过程类似,包括如下一些步骤:
- 词法分析
- 语法分析
- 语义分析
Optimizer
-
为什么需要优化器?
完成一条SQL语句的目标可能有多种不同的实现方案。
例如
SELECT * FROM A,B,C WHERE A.a1 = B.b1 and A.a1 = C.b1;可以先对AB做连结,也可以先对BC做连接或者是AC。
-
基于规则的优化:
- 条件化简,例如
a = 5 & b>a可以化简为a = 5 & b>5 - 表连接优化:基于最小的表连接
- SCAN优化:唯一索引>普通索引>全表扫描
- 条件化简,例如
-
基于代价(Cost)的优化
-
一个查询有多种执行方案,CBO会选择代价最小的方案来执行
-
代价包括什么?
- 时间,IO,CPU,网络,内存占用等等。
- 考虑整体代价最低,不一定是单个查询代价最低
-
Executor
-
火山模型:
- Projector -> Filter -> Table Scan -> Storage Engine
- 逐层调用然后逐层返回。
-
向量化
- 在上述基础上批量执行,利用SIMD指令
-
动态编译
- 将常用的部分动态编译
存储引擎
InnoDB
分为两个部分:In-Memory和On Disk
-
In-Memory
- Buffer Pool
- Change Buffer
- Adaptive Hash Index
- Log Buffer
-
On-Disk
- System Tablespace
- General Tablespaces
- Undo Tablespaces
- Temporary Tablespaces
- Redo Log
存储的部分:一部分用来存储系统信息,一部分用来存储用户数据,一部分用来存储undo redo日志等。
Buffer Pool:存放在内存的数据,用来存放页面
Page:变长字段列表,NUL标志位,Header,列数据等等
B+ Tree:用于构建索引,快速定位到对应的槽,然后快速查找到指定的记录。
事务引擎 Atomicity与Undo Log
-
如何将数据库回退到修改之前的状态呢?
使用Undo Log:
Undo Log记录的是数据的增量变化,利用Undo Log可以进行事务回滚从而保证事务的原子性。同时也解决了MVCC的过程
-
Isolation与锁
MVCC:多版本并发控制
用途:
- 读写互补阻塞
- 降低死锁概率
- 实现一致性读
-
Durability:
- 通过Redo Log来实现数据的永久保存。