前言
课程学习过程中的总结,有点水,求轻喷。
一、ACID特性与案例
1.RDBMS事务ACID特性
事务(Transaction) 是由一组SQL语句组成的一个程序执行单元(Unit), 它需要满足ACID特性。
- 原子性(Atomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
- 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
- 持久性(Durability):在事务完成以后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。
2.案例
我们可以设想一个例子,A给B转100元,需要执行的操作是A的账户减100元,B的账户加100元,如果我们的转账行为要满足ACID:
- 原子性要求:假如A账户已经扣款,我们必须要保证B的账户加上100元,不能在A扣款后,B收不到钱,即A扣款和B加钱要么同时成功要么同时失败。
- 一致性要求:加入A账户余额小于100,我们要保证A的转账操作不会发生,即每个操作必须是合法的(A账户转账金额大于余额是不合法的),应该由一个有效状态到另一个有效状态。
- 隔离性要求:假如A和C同时给B转账,需要保证B能够同时接收到A和C的钱,即两个操作并发操作时,应该互不影响。
- 持久性要求:数据更新成功后,结果应该永久保留(即保存到非易失性介质中),不能因为宕机等情况丢失。
总的来说,ACID是事务的基本性质,必须要满足ACID特性,才能够保证事务的执行是正确的,不会发生意想不到的错误,也即ACID特性是事务正确性的前提。
二、发展历史
人工->文件->DB
1.DBMS模型
- 网状模型:用有向图表示实体和实体之间的联系的模型
- 层次模型:用树形结构表示实体与实体的层次关系
- 关系模型(关系型数据库):将关系用二维表形式表示
三、关键技术
1.SQL引擎——Parser
主要包括词法分析、语法分析、语义分析等过程 词法分析主要是将SQL语句拆分为关键字、目标表、列名、常数、运算符等部分,语法分析分析出SQL语句各个部分的构成,再通过语义分析是否合法。
2.Optimizer
为什么使用Optimizer:可以有效简化计算和执行路径,有效提高SQL语句的执行性能。
(1)RBO(基于规则的优化器)
条件化简:通过数据流和执行流分析表达式最简单的形式,如a = 5 and b > a可以化简为a = 5 and b > 5。
表连接优化:总是小表先连接
Scan优化
(2)CBO(基于代价的优化器)
选择代价最低的执行方案
3.Executor
(1)火山模型:思路是向下访问(每个Operator访问下层Operator),向上求解(每个Operator求解出结果后返回上层) 优点:低耦合,逻辑简单 缺点:函数调用多,效率低 (2)向量化:一次计算一批数据,向上层返回一个向量 优点:性能更好(Cache命中率高、可以利用SIMD机制等) (3)编译执行
4.存储引擎:InnoDB(MySQL常用)
存储引擎负责了数据的底层存储、管理和访问工作。5.6之后的的版本MySQL默认存储引擎为Innodb,它具有支持事务,支持外键,支持行级锁以及崩溃恢复等特性,是目前比较优秀的存储引擎。
- Buffer Pool:存储引擎位于内存中的重要结构,用于缓存数据,减少磁盘IO的开销。在实际使用过程中采用了冷热分离机制,减少了热数据频繁切入切出的开销。
- Page:存储基本单位(类似于操作系统中的页机制)
- B+树:索引结构
5.事务引擎
- UndoLog:保证原子性,当原子操作未完成时,依赖Log进行回滚
- 锁:保证隔离性
- MVCC:保证隔离性,读写不阻塞,可以防止死锁
- 持久性:一是在事务提交前写入磁盘,二是维护Redo Log,若写入前发生故障,MySQL会根据Log重做事务。