[ RDBMS简介 | 青训营笔记]

100 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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来实现数据的永久保存。