RDBMS基本知识 | 青训营笔记

130 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第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的意义:

  1. 读写互不阻塞;
  2. 降低死锁概率;
  3. 实现一致性读;

Durability与Read Log

采用在写入之前记录日志的方式保证数据修改的永久化保存。

WAL(Write-ahead logging)

redo log是物理日志,记录的是页面的变化,它的作用是保证事务持久化。如果数据写入磁盘前发生故障,重启MySQL后会根据redo log重做。