这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
深入理解 RDBMS
经典案例
-
红包雨:
- 事务 -> 由一组SQL组成的一个程序执行单元, 满足 ACID
- ACID -> 原子性,一致性,隔离性,持久性
- A -> 不可分割,要么全做,要么不做
- C -> 数据的完整一致性,操作逻辑的合法性
- I -> 事务之间隔离,互不影响
- D -> 对数据的更新永久化,不会丢失
发展历史
前 DBMS 时代
- 人工管理 结绳、记账、打孔机(1890)
- 文件系统 1950 -> 磁盘时代
DBMS 时代
1960 -> 数据库管理系统(DBMS)
DBMS -> 按照某种数据模型来组织、存储和管理数据的仓库
数据模型 -> 网状模型、层次模型、关系模型
网状模型 -> 1964,第一个数据库系统,通用电气 IDS 诞生,1970年代流行,占主导地位,网状结构
层次模型 -> 1968 IBM,第一个大型商用数据库,树形结构
关系模型 -> 1970 IBM,E.F.Codd 博士提出。1979 Oracle开始将关系型数据库商业化
| 网状模型 | 层次模型 | 关系模型 | |
|---|---|---|---|
| 优势 | 方便直接描述关系 | 结构简单 | 将实体以及之间关系通过二维表结构表示 |
| 劣势 | 结构复杂,难用 | 无法表示多对多关系 | 关联查询效率低,规范化 |
SQL 语言
1974 IBM,将 Codd 关系数据库的 12 条准则的数学定义以简单的关键字语法表现出来,提出 SQL。
- 语法接近自然语言
- 高度非过程化
- 面向集合的操作方式
- 语言简洁,易学易用
过程化的语言就是说我告诉计算机该怎么做,用编程语言,一步一步的操作都写明,然后执行。 而非过程化的语言就是说相对简要的告诉计算机|软件我想要什么,让部分操作通过计算机|软件自己内部去解决
关键技术
一条 SQL 的一生
SQL -> RDBMS -> Parser -> Optimizer -> Executor -> Data File -> Result
SQL 引擎
-
Parser 解析器,做词法、语法、语义等分析
- 保留字、表名、常量、运算符、结束符
- 语法分析,生成语法树
- 语义分析,校验合法性
-
Optimizer 优化器
-
基于规则的优化
-
条件化简
将条件(a = 5 and b > a) 化简为 (a = 5 and b > 5)
-
表连接优化
优先小表进行连接
-
Scan 优化
数据库通过索引协助快速查询和更新数据,主要是通过 B+ 树的结构
优先级:唯一索引 > 普通索引 > 全表扫描
-
-
基于代价的优化
- 时间、资源(IO、CPU、NET、MEM)
-
-
Executor 执行器
-
火山模型:每个操作独立出来执行,层层递归
每个算子独立,没有耦合,结构清晰,但是多次递归调用,CPU效率低
-
向量化模型:使用批处理,相同操作一批一批执行
CPU cache 命中率高,函数调用次数减少,可利用CPU 的 SIMD 机制
-
编译执行:把所有操作写到一个执行函数中
通过动态编译技术 LLVM ,动态生成 SQL 的执行代码
-