这是我参与「第五届青训营」伴学笔记创作活动的第16天
1、发展历史
1.1、前DBMS时代
1.1.1、人工管理
在现代计算机发明出来以前,通过人工的方式进行数据记录和管理——效率低
1.1.2、文件系统
1.2、DBMS时代
1.2.1、数据模型
- 网状模型
- 优势:
- 能直接描述现实世界
- 存取效率较高
- 劣势
- 结构复杂
- 用户不易使用
- 访问程序设计复杂
- 优势:
- 层次模型
- 优势:
- 结构简单
- 查询效率高
- 可以提供较好的完整性支持
- 劣势:
- 无法表示M:N的关系
- 插入、删除限制多
- 遍历子节点必须经过父节点
- 访问程序设计复杂
- 优势:
- 关系模型
- 优势:
- 实体及实体间的的联系都通过二维表结构表示
- 可以方便的表示M:N关系
- 数据访问路径对用户透明
- 劣势:
- 关联查询效率不够高
- 关系必须规范化
- 优势:
1.3、SQL语句
1974年IBM的Ray Boyce和Don Chamberlin将Codd关系数据库的12条准则的数学定义以简单的关键字语法表现出来,里程碑式地提出了SQL(Structured Query Language)语言。
特点:
- 语法风格接近自然语言;
- 高度非过程化;
- 面向集合的操作方式;
- 语言简洁,易学易用。
2、关键技术
2.1、SQL引擎
- 查询解折:SQL语言接近自然语言,入门容易。但是各种关键字、操作符组合起来,可以表达丰富的语意。因此想要处理SQL命令,首先将文本解析成结构化数据,也就是抽象语法树(AST)。
- 查询优化:SQL是一门表意的语言,只是说要做什么,而不说怎么做,所以需要一些复杂的逻辑选择如何拿数据,也就是选择一个好的查询计划。优化器的作用根据AST优化产生最优执行计划(PlanTree) 。
- 查询执行:根据查询计划,完成数据读取、处理、写入等操作。
- 事务引擎:处理事务一致性、并发、读写隔离等
- 存储引擎:内存中的数据缓存区、数据文件、日志文件
2.1.1、SQL引擎——Parser
解析器(Parser)一般分为词法分析(Lexical analysis)、语法分析(Syntax analysis)、语义分析(Semantic analyzer)等步骤。
2.1.2、SQL引擎——Optimizer
基于规则的优化(RBO Rule Base Optimizer)
- 条件化简
- 表连接优化
- 总是小表先进行连接
- Scan优化
- 唯一索引
- 普通索引
- 全表扫描
- 数据库索引:是数据库管理系统中辅助数据结构,以协助快速查询、更新数据库表中数据。目前数据库中最常用的索引是通过B+树实现的。
2.1.3、SQL引擎——Executor
- 火山模型:
每个Operator调用Next操作,访问下层Operator,获得下层operator返回的一行数据,经过计算之后,将这行数据返回给上层。
优点: 每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单.
缺点: 每计算一条数据有多次函数调用开销,导致CPU效率不高。 - 向量化:
每个Operator每次操作计算的不再是一行数据,而是一批数据(Batch N行数据),计算完成后向上层算子返回一个Batch。
优点: 函数调用次数降低为1/N;CPU cache命中率更高;可以利用CPU提供的SIMD(Single Instruction Multi Data)机制。 - 编译执行
将所有的操作封装到一个函数里面,函数调用的代价也能大幅度降低。
2.2、存储引擎
2.2.1、InnoDB
2.2.2、Buffer Pool
2.2.3、Page
2.2.3、B+树
2.3、事务引擎
2.3.1、Atomicity Undo
Undo Log是逻辑日志,记录的是数据的增量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制(MVCC) ,解决读写冲突和一致性读的问题。
2.3.2、lsolation与锁
lsolation (隔离性)︰数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。如果多个并发事务访问同一行记录,就需要锁机制来保证了。
读写是否冲突?读写互不阻塞,MVCC机制。
2.3.3、lsolation 与MVCC
- MVCC的意义:
- 读写互不阻塞;
- 降低死锁概率;
- 实现一致性读。
- Undo Log在MVCC的作用:
- 每个事务有一个单增的事务ID;
- 数据页的行记录中包含了DB_ROW_ID,DB_TRX_ID,DB_ROLL_PTR;
- DB_ROLL_PTR将数据行的所有快照记录都通过链表的结构串联了起来。
2.3.4、Durability Redo Log
- 如何保证事务结束后,对数据的修改永久的保存?
- 方案一:事务提交前页面写盘
- 方案二: WAL(Write-ahead logging)
- redo log是物理日志,记录的是页面的变化,它的作用是保证事务持久化。如果数据写入磁盘前发生故障,重启MySQL后会根据redo log重做。