这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
经典案例
抖音红包雨
从一个账号扣除金额,在另一个账号增加金额
sql语句update描述上述两个步骤与自然语言很相似
RDBMS事务ACID
Transaction(事务):是有一组SQL语句组成的一个程序执行单元,需要满足ACID特性。
ACID
原子性(Atomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生
一致性C(Consistency):数据库事务不能破坏关系型数据的完整性以及业务逻辑上的一致性。红包雨中,账户如果金额不足,不应该被扣为负数,非法操作不能被接受。
隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其他事务运行效果
持久性(Durability):在事务完成以后,改事务所对数据库所做的更改应该持久的保存在数据库之中,不会被回滚。
高并发:单位时间处理的请求多
高可靠:服务是可靠的,特别是在一些关键的时间节点上,不能宕机
发展历史
前DBMS时代:
1956年IBM发布了第一个磁盘驱动器--Model 305 RAMAC,数据进入磁盘时代,数据管理直接通过文件系统来实现。
DBMS时代:
1960s,DBMS产生 ,DBMS就是按照某种数据模型来组织、存储和管理数据的仓库,通常按照数据模型的特点将传统数据库系统分为网状数据库、层次数据库和关系数据库三类。
网状数据库以网络的形式组织,层次数据库以树的形式组织
关系模型:
1970年IBM的研究院E.F.Codd博士发表论文,首次提出关系模型的概念。1979年Oracle首次将关系型数据库商业化。
优点:实体和联系都通过二维表结构表示,可以方便的表示M:N关系,数据访问路径对用户透明
缺点:关联查询效率不高,关系必须规范化
SQL语言:
1974年,IBM将关系型数据库的12条准则的数字定义以简单的关键字语法表现出来,提出了SQL语言(Structured Query Language)
Java等编程语言是过程化的语言,需要明确操作流程
SQL特点:
语法风格接近自然语言
非过程化
面向集合的操作方式
语言简洁,易学易用
DB发展历史
关键技术
SQL的一生
用户请求到达RDBMS之后,这条SQL语句首先经过Parser 语法解析器,生成一个语法树(AST)给到优化器(Optimizer),根据语法树生成如何执行的Plan,之后到达执行器,执行器从文件中读取数据,写入数据,写入日志,并将结果返回给用户。
Parser Optimizer Execcutor是SQL引擎,Data File,Log File是存储引擎
Parser
分为词法分析(Lexical analysis)、语法分析(Syntax analysis)、语义分析(Semantic analysis)
词法分析就是去提取SQL中的一些组成部分,语法分析就是根据组成部分生成语法树,即特定的数据结构,最后进行语义分析,做一些合法性校验。
Optimizer
基于规则的优化(RBO rule base optimizer)
- 条件化简:
a>5 and a<5 =>false
- 表连接优化:例如:总是小表先连接
- Scan优化:
唯一索引、普通索引、全表扫描
基于代价的优化(CBO cost base optimizer)
选择代价最低的方案去执行
Executor
向量化:
编译执行:
动态编译技术:通过解析和优化后得到的执行计划,之后将根据计划树来动态生成执行的代码路径。
存储引擎-InnoDB
Buffer Pool
每个页面64KB 每个chunk128M
Page
Buffer Pool中将内存分为小的64KB的空间,就是一个Page。
B+ Tree
事务引擎
Atomicity被和Undo Log
Undo Log是逻辑日志,记录的是数据的增量变化,利用Undo Log可以进行事务回滚,保证事务的原子性
Isolation与MVCC
Durability 与Redo Log