这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
数据库管理系统(DBMS)
DBMS:按照某种数据模型来组织、存储和管理数据的仓库, 通常按照数据模型的特点将传统数据库系统分成网状数据库、层次数据库和关系数据库三类
| 网状模型 | 层次模型 | 关系模型 | |
|---|---|---|---|
| 优势 | 能直接描述现实世界 存取效率高 | 结构简单 查询效率高 可以提供较好的完整性支持 | 实体及实体间的联系都通过二维结构表示 可以方便的表示M:N关系 数据访问路径对用户透明 |
| 劣势 | 结构复杂 用户不易使用 访问程序设计复杂 | 无法表示M:N的关系 插入、删除限制多 遍历子节点必须经过父节点 访问程序设计复杂 | 关联查询效率不够高 关系必须规范化 |
RDBMS事务ACID
事务是由一组SQL语句组成的一个程序执行单元(Unit),它需要满足ACID特性(原子性、一致性、隔离性、持久性)
- 原子性(Atomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
- 隔离性(solation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
- 持久性(urability):在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
关键技术
一条SQL语句的一生
UPDATE account_table SET balance = balance - '小目标' WHERE name = '抖音';
上面这条语句传到后台,首先由parser解析SQL语句,生成语法树AST;语法树传递到optimizer,由optimizer生成plan tree,决定SQL语句到底怎么执行;plan tree传到executor,操作数据文件,写入日志,将结果返回RDBMS。
SQL引擎
Parser
主要分为词法分析、语法分析、语义分析三个步骤
词法分析将sql语句拆分为关键字、表列名、常量、运算符、结束符
语法分析把关键词生成语法树,转化成机器能看懂的语言
语义分析是合法性校验,例如检查常量类型是否合法
Optimizer
基于规则的优化(RBO,rule base optimizer)
- 条件化简
- 表连接优化 总是小表先进行连接
- scan优化 唯一索引、普通索引、全表扫描 基于代价的优化(CBO,cost base optimizer)
- 代价:时间 io cpu net mem
- 一个查询有多种执行方案 cbo会选择其中代价最低的方案去执行
Excecutor
火山模型
- 优点:每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单
- 缺点:每计算一条数据有多次函数调用开销,函数调用涉及到栈的切换,导致cpu效率不高