这是我参与「第五届青训营 」笔记创作活动的第11天
RDBMS
发展历史
前DBMS时代
人工管理:数据存储在纸质资料
文件系统:数据存储进入因硬盘时代
DBMS时代
DBMS——数据库管理系统
DBMS:按照某种数据模型来组织、存储和管理数据的仓库、
通常按照数据类型的特点将传统数据库系统分成网状数据库、层次数据库和关系数据库三类。
DBMS数据模型
网状模型
- 优势:能直接描述现实世界;存储效率较高
- 劣势:结构复杂;用户不易使用
层次模型
- 优势:结构简单;查询效率高;可以提供较好的完整性支持
- 劣势:无法表示M:N关系;插入、删除限制多;遍历字节点必须经过父节点;访问程序设计复杂
关系模型
- 优势:实体及实体间的联系都通过二维数据表结构表示;可以方便的表示M:N的关系;数据访问路径对用户透明
- 劣势:关联查询效率不高;关系必须规范化
SQL语言
1974年IBM的Ray Boyce和DonChamberlin将Codd关系数据库的2条准则的数学定义以简单的关健字语法表现出来,里程碑式地提出了SQL(Structured Query Language)语言。
- 语法风格接近自然语言
- 高度非过程化
- 面向集合的操作方式
- 语言简洁,易学易用
关键技术
SQL引擎
Parser:解析器(Parser)一股分为词法分析(Lexical analysis)、语法分析(Syntax analysis)、语义分析(Semantic analyzer)等步骤。
Optimizer:优化器
- 基于规则优化(RBO Rule Base Optimizer):条件化简;表连接优化(总是小表先进行连接);Scan优化(唯一索引;普通所以;全表扫描)
- 基于代价的优化(CBO Cost Base Optimizer):IO/CPU/NET/MEM时间代价
Executor:执行器
-
火山模型:每个Operator调用Next操作,访问下层Operator,获得下层perator返回的一行数据,经过计算之后,将这行数据返回给上层。
每个算子独立抽象实现,相互之间没有耦合
每计算一条数据有多次函数调用开销,导致CPU效率不高
-
向量化:每个Operator每次操作计算的不再是一行数据,而是一批数据(Batch N行数据),计算完成后向上层算子返回一个Batch。
函数调用次数降低为1/N
CPU cache命中率更高
可以利用CPU提供的SIMD机制
-
编译执行:将所有的操作封装到一个函数里面,函数调用的代价也能大幅度降低。LLVM动态编译执行技术。
存储引擎
InnoDB:MySQL的数据库引擎之一,现为MySQL的默认存储引擎
Buffer Pool:就是把磁盘上的页,缓存到内存中,用于降低与磁盘直接进行IO的成本。
Page:以页为单位存储数据。我们进行的增删改查操作本质上都是在操作数据页(包括读页、写页、创建新页)
B+ Tree:页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。从根到叶:中间节点存储
事务引擎
ACID:原子性、一致性、隔离性、持久性
Undo Log:Undo Log是逻辑日志,记录的足数据的增量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制(MvCc)解决读写冲突和一致性读的问题。
MVCC意义:
- 读写互不阻塞
- 降低死锁概率
- 实现一致性读
Redo Log:Redo Log是物理日志,记录的是页面的变化,它的作用是保证事务持久化。如果数据写入磁盘前发生故障,更启MySQL后会根据redo log里做。