RDBMS | 青训营笔记

115 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第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里做。