RDBMS | 青训营

90 阅读4分钟

RDBMS 事务 ACID

事务(Transaction):是由一组SQL语句组成的一个程序执行单元(Unit),它需要满足ACID特性。

ACID:

  • 原子性:事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么一个都不发生。
  • 一致性:数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
  • 隔离性:多花个事务并发访问的时候,事务之间是隔离的,一个事务不应该影响其他事务运行效果和结果。
  • 持久性:在事务完成以后,该事务所对数据库所做的更改持久的保存在数据库中,并不会被回滚。

Case One(原子性): 存钱的时候,把钱存进去了,但是服务器挂机了,账户没来得及加上刚存的钱,你就亏死了。 两个操作要么同时成功,要么同时失败,不存在之间状态。

Case Two(一致性): 取钱的时候,最多取账户最大的数额,不存在负数的账户。 每个操作都必须是合法的,账户信息一个是从一个有效的状态变为另一个有效状态。

Case Three(隔离性): 两个人同时对账户进行取钱,如果银行只减了一个人取的钱,账户就相当多出了一笔钱,银行就亏嘛了。 两个操作在对同一个账户并发进行操作时,一个是互相不影响的,表现的像是串联操作。

Case Four(持久性): 你存钱的时候,钱还没写到磁盘上。这个时候,如果服务器挂了,钱又没了。 操作更新成功之后,更新的结果应该永久性的保留下来,不会因为宕机等问题而丢失。

Case Five(高并发): 假如几十万,几百万人同时操作账户,就不能太慢了。

DBMS数据模型

优势

网状模型:

  • 直接描述现实世界
  • 存取效率较高

层次模型:

  • 结果简单
  • 查询效率高
  • 可以提供较好的完整性支持

关系模型(现在最常用的模型):

  • 实体间的联系的偶通过二维表结果表示
  • 可以方便的表示M:N关系
  • 数据访问路径对用户透明

劣势

网状模型:

  • 结构复杂
  • 用户不方便使用
  • 访问程序设计复杂

层次模型:

  • 无法表示M:N关系
  • 插入、删除限制太多
  • 遍历子节点必须经过父节点
  • 访问程序设计复杂

关系模型(现在最常用的模型):

  • 关联查询效率还是不够高
  • 关系必须规范化

关键技术

SQL引擎-Parser(解析器)

Parser(解析器)

一般分为词法分析,语法分析,语义分析。。。

所有的代码在执行之前,都存在一个解析编译的过程,差异点无非在于是静态解析编译还是动态的。SQL语言也类似,在SQL查询执行前的第一步就是查询解析。

词法分析:将一条SQL语句对应的字符串分割为一个个token,这些token可以简单分类。

语法分折析:把词法分析的结果转为语法例。根据token序列匹配不同的语法规则,比如这里匹配的是update语法原则,类似的还有insert,delete.,select,create,drop 等语法规则,根据语法规则匹配SQL语句中的关键字,最终输出—个结构化的数据结构。

语义分析:对语法树中的信息进行合法性校验。

SQL引擎(Optimizer)

  • 条件化简

a = 5 and b > a

a > 5 and a < b and b = 1

= = = >

a =5 and b > 5

False

  • 表的连接优化
  1. 总是小表进行连接

SELECT * FROM A, B ,C WHERE A.a1 = B.b1 AND A.a1 = C.b1;

  • Scan优化
  1. 唯一索引
  2. 平台索引
  3. 全表扫描

数据库索引:是数据库管理系统中辅助数据结构,以协助快速查询、更新数据库表中数据。目前数据库中最常用的索引是通过 B+树 实现的。

SQL引擎-(Executor)

![F$97ZP%CC_VA{HDH077(1K.png

每个Operator调用Next操作,访问下层Operator,获得下层Operator返回的一行数据,经过计算之后,将这行数据返回给上层。

优点: 每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单

缺点: 每计算一条数据有多次函数调用开销,导致CPU效率不高。

(注:Plan Tree为基础;调用关系是由根到叶,数据流是从叶到根)