这是我参与「第五届青训营」伴学笔记创作活动的第 15 天
今日内容
学习完了青训营课程 后端入门 - 存储与数据库 中的 RDBMS 基本情况介绍 、 RDBMS 关键技术分析 和 RDBMS 企业实践案例 之后的一些总结。
课程内容
- 经典案例
- 发展历史
- 关键技术
- 企业实践
1. 经典案例
事务 ACID
事务(Transaction)是由一组 sql 语句组成的一个程序执行单元,它需要满足 ACID 特性
对于 ACID 的理解和高并发高可靠
2. 发展历史
- 人工
- 文件系统
- DBMS
- 网状模型
- 优点:能直接描述现实世界;存储效率高
- 缺点:结构复杂;用户不易使用;访问程序设计复杂
- 层次模型
- 优点:结构简单;查询效率高;可以提供较好的完整性支持
- 缺点:无法表示 M:N 的关系;插入删除限制多;遍历子节点必须经过父节点;访问程序设计复杂
- 关系模型
- 优点:实体及实体之间的联系都通过二维结构表示;可以方便表示 M:N 关系;数据访问路径对用户透明
- 缺点:关联查询效率不高;关系必须规范化
- 网状模型
sql 语言
3. 关键技术
一条 sql 的一生
Parser
解析器(Parser)一般分为词法分析、语法分析、语义分析等步骤
Optimizer
为什么需要优化器(Optimizer)?效率问题
- 基于规则的优化
- 表连接优化
- Scan 优化
- 基于代价的优化
Executor
- 火山模型:每个 Optimizer 调用 Next 操作,访问下层 Operator,获得下层 Operator 返回的一行数据,经过计算后,将这行数据返回给上层
- 优点:每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单
- 缺点:每计算一条数据有多次函数调用开销,导致 CPU 效率不高
- 向量化:批量处理数据
- 编译执行:将所有的操作封装到一个函数里面,函数调用的代价也会降低
InnoDB
涉及到数据库存储的细节
- 存储引擎
- Buffer Pool
- Page
- B+ Tree
事务引擎
- Atomicity 与 Undo Log
- Isolation 与锁
- Isolation 与 MVCC
- Durability 与 Redo Log
4. 企业实践
大流量 - Sharding
- 问题背景
- 单节点容易成为瓶颈
- 单机数据容量上限
- 解决方案
- 业务数据进行水平拆分
- 代理层进行分片路由
- 实施效果
- 数据库写入性能线性扩展
- 数据库容量线性扩展
流量突增 - 扩容
- 问题背景
- 活动流量上涨
- 集群性能不满足要求
- 解决方案
- 扩容 DB 物理节点数量
- 利用影子表进行压测
- 实施效果
- 数据库集群提供更高的吞吐
- 保证集群可以承担预期流量
流量突增 - 代理连接池
- 问题背景
- 突增流量导致大量建联
- 大量建联导致负载变大,延时上升
- 解决方案
- 业务侧预热连接池
- 代理侧预热连接池
- 代理侧支持连接队列
- 实施效果
- 避免 DB 被流量突增打死
- 避免代理和 DB 被大量建联打死