这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
深入理解 RDBMS
前置概念
- 事务
- 简介: 一组具有 ACID 特性 的操作。
- 解读
- A(原子性):
- 事务的所有操作要么都成功,要么都失败。
- C(一致性):
- 事务执行前后,数据状态是一致的,符合预期的。
- I(隔离性):
- 定义并发事务间的隔离级别。
- D(持久性):
- 已经提交的事务不会丢失。
- A(原子性):
- 高并发
- 能够同时处理大的请求。
- 高可靠
- 提供的服务不会宕机。
发展历史
- 前 DBMS 时代 - 人工管理
- 前 DBMS 时代 - 文件系统
- 通过文件存数据,数据过于庞大后,更新、检索数字不便。
- DBMS 时代
- 按照某种数据模型,组织、管理数据的仓库。
- 常见数据模型
- 网状模型
- 层次模型
- 关系模型
- 常见数据模型
- 按照某种数据模型,组织、管理数据的仓库。
- SQL 语言诞生
- 简介
- 结构化查询语言,用来语义化操作数据库的。
- 特点
- 语法风格接近自然语言。
- 高度非过程化。
- 面对集合的操作方式。
- 语言简洁、简单易用。
- 简介
关键技术
一条 SQL 执行的流程
- SQL 命令发给数据库。
- 语法解析:
- 语法解析器将 SQL 语言生成语法树(AST)。
- 优化:
- 优化器根据语法树生成具体执行方案(Plan)。
- 执行:
- 执行器根据执行方案(Plan)执行。
- 执行器文件中读取/写入数据,并写入日志。
- 返回客户端。
SQL 引擎
解析器
三个阶段
- 词法分析:
- 解析 SQL 中保留字,生成关键词。
- 语法分析:
- 将关键词生成语法树(AST)。
- 语义分析:
- 判断上下文相关的信息是否正确(判断合法性)。
优化器
- 简介:
- 选择表连接顺序 / 是否走索引。选择最优的执行方案。
- 类别:
- 基于规则的优化器:
- 常见规则:
- 总是小表先连接。
- 尽量走索引。
- 常见规则:
- 基于代价的优化器:
- 代价:
- 硬件资源:IO、CPU、NET、MEM。
- 整体并发最优。
- 代价:
- 基于规则的优化器:
执行器
- 执行模型:
- 火山模型:
- 简介:
- 调用时逐层向下调用,返回时逐级返回
- 特点:
- 每一层相互独立,相互没有耦合,逻辑结构简单。
- 一条数据需要多个函数调用,CPU 效率不高。
- 简介:
- 向量化
- 简介:
- 每次操作不是一行一行的返回,而是一批一批返回。
- 特点:
- 一批一批返回,函数调用次数下降。
- 一次返回一批数据,CPU 可以更好利用缓存。
- 可以
- 简介:
- 编译执行:
- 简介:
- 将所有优化器代码写到一个函数中,动态编译后执行,从而减少函数调用
- 特点;
- 动态编译,有选择的编译代码。
- 简介:
- 火山模型:
存储引擎 - InnoDB
- 整体架构图
- 内存中部分:
- Buffer Pool
- Log Buffer
- 磁盘中部分:
- System Tablespace(ibdata1文件):
- 系统表,用来存储元数据。比如用户自建表的名字、索引信息、数据信息。
- General Tablespace(xxx.ibd 文件):
- 普通表,用来存储用户自建表。
- Undo Tablespace(xxx.ibu 文件):
- undo 表,用来存储 undo 日志。
- Redo log
- 用来存储 Redo log。
- Temporary Tablespace(xxx.ibd):
- 临时表空间,用来存储表连接操作中间结果。
- Doublewrite Buffer Files(xxx.dblwr文件)
- 双写日志buffer文件。
- System Tablespace(ibdata1文件):
- Buffer Pool:
- 存储结构:
- 存储单元由小到大:
- block:
- 一个页面大小为 16K。
- chunk:
- 一个 chunk 包含 8192 个 block,共计128K,Buffer Pool 以 chunk 为基本单位申请内存。
- instance:
- 一个 instance 包含多个 chunk。instance 将不同 chunk 进行分组。
- 用户访问时可以按照分组进行访问,从而减少冲突。
- block:
- 数据结构1:HashMap<page_id, block*>
- 图示:
- 用途:
- 通过 page_id 快速找到所在 block。
- 对 page_id 进行hash,判断在哪个 hash 桶中,来快速查找。
- 图示:
- 数据结构2:LRU
- 图示:
- 用途:
- 磁盘容量远远大于内存,通过 LRU 数据结构,将内存中不常用数据淘汰。
- 图示:
- 存储结构:
- Page:
- 简介:
- buffer pool 的 block 概念,对应到磁盘中就是 page,page 默认大小 16K。
- 记录存储格式:
- 变长字段列表:
- 给定边长字段的位置及长度。
- NULL 值标志位:
- 用来标记哪些为空。
- Header
- 记录该记录元信息。是否被删除,下一条数据位置,当前记录类型。
- row_id:
- 行 id。
- trx-id:
- 事务 id。
- roll-ptr
- 回滚指针。
- page 存储格式:
- Page Header:
- page 元数据。
- User Records:
- 用户记录。
- Free Space:
- 空闲空间。
- Page Directory:
- 图示:
- page 索引,多个 Page 的 page directory 共同构成 B+ 来优化扫描。
- 图示:
- FIL Trailer
- 简介:
- B+ Tree:
- 简介: Page Directory 共同组成 B+ 树来优化查询效率。
- 图示: