这是我参与「第五届青训营」伴学笔记创作活动的第5天
RDBMS
即关系型数据库的缩写
1️⃣发展历史
前DBMS时代
最早计算机还未诞生时,采用人工管理的方式进行数据的记录
1956年IBM发布第一个磁盘,从此进入磁盘时代,数据通过最早期的文件系统来实现。
DBMS时代 (数据库管理系统时代)
DBMS: 按照某种数据模型来组织,存储和管理数据的仓库
按照数据模型的特点将数据库分为网状数据库, 层次数据库, 和关系型数据库三类
三者的优劣如下:
历史时间线回顾:
2️⃣SQL语言
1974年IBM的工程师将关系型数据库的12条准则通过数学定义表现出来,提出了SQL语言。
包含以以下特点:
🔸语法风格接近自然语言
🔸高度非过程化
🔸面向集合的操作方式
🔸语言简洁,易学易用
2.1SQL语句的执行过程
当用户发起一个请求后,路由器会相应请求到服务器上,会进行以下操作:
🔸1.查询解折:利用SQL引擎(Parser)SQL语言接近自然语言,入门容易。但是各种关键字、操作符组合起来,可以表达丰富的语意。因此想要处理SQL命令,首先将文本解析成结构化数据,也就是抽象语法树(AST)。
🔸2.查询优化:SQL是一门表意的语言,只是说要做什么,而不说怎么做,所以需要一些复杂的逻辑选择如何拿数据,也就是选择一个好的查询计划。优化器的作用根据AST优化产生最优执行计划(PlanTree)。
🔸3.查询执行:使用执行器,根据查询计划,完成数据读取、处理、写入等操作到存储引擎中(Data File/Log File)。
存储引擎:内存中的数据缓存区、数据文件、日志文件
2.2SQL引擎- Parser
中文名解析器, 分为词法分析,语法分析, 语义分析,等步骤
流程图如下:
2.3 SQL引擎-优化器Optimizer
基于规则的优化(RBO Rule Base Optimizer) 例如MySQL中的Select语句
优化方式:
🔸条件化简
🔸表连接优化 :总是小表先进行连接
🔸Scan优化(扫描优化):
1.唯一索引
2.普通索引
3.全表扫描
数据库索引:是数据库管理系统中辅助数据结构,以协助快速查询、更新数据库表中数据。
目前数据库中最常用的索引是通过B+树实现的。
2.4 SQL引擎-执行器Executor
2.4.1火山模型
每个Operator调用Next操作,访问下层Operator,获得下层operator返回的一行数据,经过计算之后,将这行数据返回给上层。
☑ 优点:每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单
❌缺点: 每计算一条数据有多次函数调用开销,导致CPU效率不高
2.4.2向量化
每个Operator每次操作计算的不再是一行数据,而是一批数据(Batch N行数据),计算完成后向上层算子返回一个Batch。
☑ 优点 :
1.函数调用次数少,为1/N;
2.CPU cache命中率更高
3,可以利用CPU提供的SIMD(Single Instruction Multi Data)机制。
2.5 存储引擎 - InnoDB
分布情况如下图:
分为 Buffer Pool 缓冲池, Page 页表, B+树等
2.6事务引擎
2.6.1 Atomicity 与 Undo Log
Atomicity 原子性:要么成功,要么失败,并没有中间的状态
Undo Log 个人理解为数据库里的撤销功能, 记录数据的增量变化,可以进行回滚保持事物的原子性,同时实现了多版本的并发控制(MVCC), 保持了读写冲突和一致性读的问题。
2.6.2 Isolation 锁
lsolation (隔离性)︰数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。如果多个并发事务访问同一行记录,就需要锁机制来保证了。
类似操作系统中生产者和消费者的问题,需要对指定变量进行加锁操作防止同时读写。
由于MVCC机制,读写互不阻塞。
2.6.3 Durability Redo Log
Redo log是物理日志,记录的是页面的变化,它的作用是保证事务持久化。如果数据写入磁盘前发生故障,重启MySQL后会根据Redo log重做。
对数据的修改永久的保存的方式:
🔸方案一:事务提交前页面写盘
🔸方案二: WAL(Write-ahead logging)