这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
本篇笔记主要记录一下深入理解RDBMS的学习知识
1.RDBMS发展历程
- 前DBMS时代 - 人工管理
- 前DBMS时代 - 文件系统
- DBMS时代 按照数据模型特点分为网状数据库、层次数据库、关系数据库三类
DBMS数据模型:
- 网状模型 - 网状数据库所基于的网状数据模型建立的数据之间的联系,能反映现实世界中信息的关联,是许多空间对象的自然表达形式
- 层次模型 - 使用树形结构来描述实体及其之间关系的数据模型
- 关系模型
SQL语言:1974年IBM的Ray Boyce和Don Chamberlin将Codd关系数据库的12条准则的数学定义以简单的关键字语法表现出来,里程碑式地提出了SQL语言
- 语法风格接近自然语言
- 高度非过程化
- 面向集合的操作方式
- 语言简洁,易学易用
2.关键技术
1.一条SQL的历程
2.SQL引擎
解析器Parser:一般分为词法分析、语法分析、语义分析等步骤 优化器Optimizer:
- 基于规则的优化 (RBO Rule Base Optimizer)
-
- 条件化简
-
- 表连接优化,总是小表先进行连接
-
- Scan优化,唯一索引、普通索引、全表扫描
- 基于代价的优化 (CBO Cost Base Optimizer)
- 一个查询有多种执行方案,CBO会选择其中代价最低的方案去真正的执行 执行器Executor:
火山模型:
每个Operator调用Next操作,访问下层Operator,获得下层Operator返回的一行数据,经过计算之后将这行数据返回给上层
- 优点:每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单
- 缺点:每计算一条数据有多次函数调用开销,导致CPU效率不高
向量化模型:
每个Operator每次操作计算的不再是一行数据,而是一批数据(Batch N行数据),计算完成后向上层算子返回一个Batch
优点:
- 函数调用次数降低为1/N
- CPU cache命中率更高
- 可以利用CPU提供的SIMD(Single Instruction Multi Data)机制
编译执行:
3.存储引擎
- InnoDB
- Buffer Pool
- Page
- B+ Tree
4.事务引擎
- Atomicity与Undo Log:Undo Log是逻辑日志,记录的是数据的增量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制 (MVCC) 解决读写冲突和一致性读的问题
- Lsolation与锁:写写冲突,只允许一个执行
- Lsolation与MVCC:读写互不阻塞,降低死锁概率,实现一致性读 (MVCC的意义)
- Durability与Redo Log:Redo Log是物理日志,记录的是页面的变化,它的作用是保证事务持久化
3.场景实践
- 大流量:
-
- 问题背景:单节点写容易成为瓶颈、单机数据容量上限
-
- 解决方案:业务数据进行水平拆分、代理层进行分片路由
-
- 实施效果:数据库写入性能线性扩展、数据库容量线性扩展
- 流量突增:
-
- 扩容:
-
-
- 问题背景:活动流量上涨、集群性能不满足要求
-
-
-
- 解决方案:扩容DB物理节点数量、利用影子表进行压测
-
-
-
- 实施效果:数据库集群提供更高的吞吐、保证集群可以承担预期流量
-
-
- 代理连接池:
-
-
- 问题背景:突增流量导致大量建联、大量建联导致负载变大,延时上升
-
-
-
- 解决方案:业务侧预热连接池、代理侧预热连接池、代理侧支持连接队列
-
-
-
- 实施效果:避免DB被突增流量打死宕机、避免代理和DB被大量建联打死宕机
-
- 稳定性&可靠性:
-
- 3AZ高可用
-
- HA管理:
4.总结
人生苦短,不如go浪一下。