这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天
发展历程
前DBMS时代——文件系统
1950s,现代计算机的雏形基本出现。1956年IBM发布了第一个的磁盘驱动器--Model 305 RAMAC,从此数据存储进入磁盘时代。在这个阶段,数据管理直接通过文件系统来实现。
DBMS时代
1960s,传统的文件系统已经不能满足人们的需要,数据库管理系统(DBMS)应运而生。
DBMS :按照某种数据模型来组织、存储和管理数据的仓库。
所以通常按照数据模型的特点将传统数据库系统分成网状数据库、层次数据库和关系数据库三类。
DBMS数据模型
SQL
1974年IBM的Ray Boyce和Don Chamberlin将Codd关系数据库的12条准则的数学定义以简单的关键字语法表现出来,里程碑式地提出了SQL(Structured Query Language)语言。
ACID
- 原子性(Atomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生
- 一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。(每个操作都必须是合法的,如账户信息应该从一个有效的状态变为另一个有效的状态,而不能变为负数)
- 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
- 持久性(Durability):在事务完成以后,该事务所对数据库所作的更改应持久的保存在数据库之中,并不会被回滚。
一条SQL语句的执行过程
SQL引擎——Parser解析器
解析器(Parser)一般分为词法分析、语法分析、语义分析等步骤。
SQL引擎——Optimizer优化器
基于规则的优化
如定义规则:总是小表先进行连接
基于代价的优化
一个查询有多种执行方案,CBO会选择其中代价最低(如时间,IO,CPU等资源)的方案去真正的执行。
SQL引擎——Executor
存储引擎——InnoDB
InnoDB通过使用多版本并发控制MVCC来获的高并发性,并且实现SQL标准的四种隔离级别,默认是REPEATABLE, 同时使用next-key locking的策略来避免幻读
InnoDB存储引擎还提供了以下四种高性能和高可用的功能。
- 插入缓存
- 二次写
- 自适应哈希索引
- 预读
对于表中数据的存储,InnoDB存储引擎采用聚集clustered的方式,因此每个表的数据都是按照主键的顺序进行存放,如果没有显示的指定主键,InnoDB默认会为每一行生产一个6字节的ROWID并以此作为主键;每个InnoDB存储引擎的在磁盘上存储为两个文件:.frm文件(表结构的数据文件),.ibd文件(用来存储数据和索引文件)
存储引擎——B+树
事务引擎
原子性
如何将数据库回退到修改前的状态?
Undo Log是逻辑日志,记录的是数据的增量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制(MVCC) ,解决读写冲突和一致性读的问题。
隔离性
锁和MVVC
持久性
如何保证事务结束后,对数据的修改永久的保存?
方案一:事务提交前页面写盘
方案二: WAL(Write-ahead logging)
redo log是物理日志,记录的是页面的变化,它的作用是保证事务持久化。如果数据写入磁盘前发生故障,重启MySQL后会根据redo log重做。