深入理解RDBMS | 青训营笔记

87 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天

发展历程

前DBMS时代——文件系统

1950s,现代计算机的雏形基本出现。1956年IBM发布了第一个的磁盘驱动器--Model 305 RAMAC,从此数据存储进入磁盘时代。在这个阶段,数据管理直接通过文件系统来实现。

DBMS时代

1960s,传统的文件系统已经不能满足人们的需要,数据库管理系统(DBMS)应运而生。
DBMS :按照某种数据模型来组织、存储和管理数据的仓库。 所以通常按照数据模型的特点将传统数据库系统分成网状数据库、层次数据库和关系数据库三类。

DBMS数据模型

image.png

SQL

1974年IBM的Ray Boyce和Don Chamberlin将Codd关系数据库的12条准则的数学定义以简单的关键字语法表现出来,里程碑式地提出了SQL(Structured Query Language)语言。

ACID

  • 原子性(Atomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生
  • 一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。(每个操作都必须是合法的,如账户信息应该从一个有效的状态变为另一个有效的状态,而不能变为负数)
  • 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
  • 持久性(Durability):在事务完成以后,该事务所对数据库所作的更改应持久的保存在数据库之中,并不会被回滚。

一条SQL语句的执行过程

image.png

SQL引擎——Parser解析器

解析器(Parser)一般分为词法分析、语法分析、语义分析等步骤。

image.png

SQL引擎——Optimizer优化器

基于规则的优化
如定义规则:总是小表先进行连接 基于代价的优化
一个查询有多种执行方案,CBO会选择其中代价最低(如时间,IO,CPU等资源)的方案去真正的执行。

SQL引擎——Executor

image.png

image.png

image.png

存储引擎——InnoDB

InnoDB通过使用多版本并发控制MVCC来获的高并发性,并且实现SQL标准的四种隔离级别,默认是REPEATABLE, 同时使用next-key locking的策略来避免幻读
InnoDB存储引擎还提供了以下四种高性能和高可用的功能。

  • 插入缓存
  • 二次写
  • 自适应哈希索引
  • 预读

对于表中数据的存储,InnoDB存储引擎采用聚集clustered的方式,因此每个表的数据都是按照主键的顺序进行存放,如果没有显示的指定主键,InnoDB默认会为每一行生产一个6字节的ROWID并以此作为主键;每个InnoDB存储引擎的在磁盘上存储为两个文件:.frm文件(表结构的数据文件),.ibd文件(用来存储数据和索引文件)

存储引擎——B+树

image.png

事务引擎

原子性

如何将数据库回退到修改前的状态?
Undo Log是逻辑日志,记录的是数据的增量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制(MVCC) ,解决读写冲突和一致性读的问题。

image.png

隔离性

锁和MVVC

持久性

如何保证事务结束后,对数据的修改永久的保存?
方案一:事务提交前页面写盘
方案二: WAL(Write-ahead logging)
redo log是物理日志,记录的是页面的变化,它的作用是保证事务持久化。如果数据写入磁盘前发生故障,重启MySQL后会根据redo log重做。