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
- 表的连接优化
- 总是小表进行连接
SELECT * FROM A, B ,C WHERE A.a1 = B.b1 AND A.a1 = C.b1;
- Scan优化
- 唯一索引
- 平台索引
- 全表扫描
数据库索引:是数据库管理系统中辅助数据结构,以协助快速查询、更新数据库表中数据。目前数据库中最常用的索引是通过 B+树 实现的。
SQL引擎-(Executor)
每个Operator调用Next操作,访问下层Operator,获得下层Operator返回的一行数据,经过计算之后,将这行数据返回给上层。
优点: 每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单
缺点: 每计算一条数据有多次函数调用开销,导致CPU效率不高。
(注:Plan Tree为基础;调用关系是由根到叶,数据流是从叶到根)