16 MySQL - 深入理解RDBMS | 青训营笔记

142 阅读6分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第17天

资料: juejin.cn/post/719769…

课程1: juejin.cn/course/byte…

课程2: juejin.cn/course/byte…

课程3: juejin.cn/course/byte…

PPT: bytedance.feishu.cn/file/boxcnC…

讲师: 杨洋

课程回顾

存储系统
    块存储, 文件存储, 对象存储, key-value存储
数据库系统
    关系型数据库, 非关系型数据库
分布式架构
    数据分布策略, 数据复制协议, 分布式事务算法

1 经典案例

1 红包雨

UPDATE account_table SET balance = balance - 金额 WHERE name = '抖音';
UPDATE account_table SET balance = balance + 金额 WHERE name = '用户';

2 事务 ACID

事务(Transaction)

BEGIN;
UPDATE account_table SET balance = balance - 金额 WHERE name = '抖音';
UPDATE account_table SET balance = balance + 金额 WHERE name = '用户';
COMMIT;

ACID: Atomicity, Consistency, Isolation, Durability

Consistency(一致性): 从一个有效状态变为另一个有效状态, 强调合法性

3 高并发, 高可靠

高并发 Concurrency

高可靠 High Reliability/Availability

2 发展历史

1 前DBMS时代 - 人工管理

结绳记事, 账本, 打孔机

2 前DBMS时代 - 文件系统

IBM 305 RAMAC

3 DBMS时代

DBMS: 数据库管理系统

1 网状数据库

1970s流行
基于网状数据模型

世界上第一个数据库系统: 集成数据存储, 诞生于IDS(通用电气公司)

2 层次数据库

使用树形结构描述实体及其之间关系的数据模型
与网状数据库最大不同是, 每个节点只有一个父节点. 多对多变成一对多

世界上第一个层次数据库: 信息管理系统, 诞生于IBM公司, 也是世界上第一个大型商用的数据库系统

3 关系型数据库

IBM研究员E.F.Codd博士发表了一篇名为"A Relational Model of Data for Large Shared Data Banks"的论文, 提出了关系模型的概念

⭐有空去学习下这篇论文, 好奇有多厉害

1979年Oracle首次将关系型数据库商业化

基于关系模型

4 DBMS数据模型总结

网状模型
优势:
能直接描述现实世界
存取效率较高
劣势:
结构复杂
用户不易使用
访问程序设计复杂
层次模型
优势:
结构简单
查询效率高
可以提供较好的完整性支持
劣势:
无法表示M:N的关系
插入, 删除限制很多
遍历子节点必须经过父节点
访问程序设计复杂
关系模型
优势:
实体及实体间的联系都通过二维表结构表示
可以方便的表示M:N关系
数据访问路径对用户透明
劣势:
关联查询效率不够高
关系必须规范化

5 SQL语言

1974年IBM的Ray Boyce和Don Chamberlin将Codd关系数据库的12条准则的数学定义以简单的关键字语法表现出来, 里程碑式的提出了SQL语言

SQL: Structured Query Language

特点:
	语法风格接近自然语言
	高度非过程化
	面向集合的操作方式
	语言简洁, 简单易用

3 关键技术

1 一条SQL的一生

见PPT图

2 SQL引擎

1 Parser(解析器)

词法分析(Lexical analysis)
语法分析(Syntax analysis)
语义分析(Semantic analysis)
等步骤

2 Optimizer(优化器)

基于规则的优化(RBO: Rule Base Optimizer)
条件化简
表连接优化(总是小表先进行连接)
Scan优化(唯一索引 > 普通索引 > 全表扫描)
基于代价的优化(CBO: Cost Base Optimizer)
选择代价最低的方案执行
代价: 时间, IO, CPU, NET, MEM(内存)

3 Executor(执行器)

执行模型:
1 火山模型(见PPT图)
优点: 每个算子独立抽象实现, 相互之间没有耦合, 逻辑结构简单
缺点: 每计算一条数据有多次函数调用开销, 导致CPU效率不高
2 向量化
每次Operator操作计算的不再是一行数据, 而是一批数据(Batch), 计算完成后向上层算子返回一个Batch
优点:
函数调用次数降低为1/N
CPU cache命中率更高
可以利用CPU提供的SIMD(Single Instruction Multi Data)机制
3 编译执行
LLVM动态编译执行技术⭐
将所有的操作封装到一个函数里面, 函数调用的代价大幅度降低

3 存储引擎

1 InnoDB

架构见PPT图

In-Memory
    Buffer Pool
    Change Buffer
    Adaptive Hash Index
    Log Buffer
On-Disk
    System Tablespaces
    General Tablespaces
    Undo Tablespaces
    Temporary Tablespaces
    Redo Log

2 Buffer Pool

LRU(Least Recently Used): 选择最近最久未使用的页面予以淘汰

3 Page

4 B+Tree

二分法快速定位到对应的槽, 然后再遍历对应分组中的记录即可快速找到指定的记录

4 事务引擎

1 Atomicity与Undo Log

Undo Log是逻辑日志, 记录的是数据的增量变化, 利用Undo Log可以进行事务回滚, 从而保证事务的原子性, 同时也实现了多版本并发控制(MVCC), 解决读写冲突和一致性读的问题

2 Isolation与锁

3 Isolation与MVCC

MVCC的意义:
读写互不阻塞
降低死锁概率
实现一致性读
Undo Log在MVCC的作用:
每个事务有一个单增的事务ID
数据页的行记录包含了DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR
DB_ROLL_PTR将数据行的所有快照记录都通过链表的结构串联了起来

脏读: 无效数据的读出

事务还没提交之前, 它对数据做的修改不应该被其他人看到.

4 Durability与Redo Log

Redo Log是物理日志, 记录的是页面(Page 16kb)的变化, 它的作用是保证事务持久化. 如果数据写入磁盘前发生故障, 重启MySQL会根据Redo Log重做

4 企业实践

1 大流量

问题背景:
单节点写容易成为瓶颈
单机数据容量上限
解决方案:
业务数据进行水平拆分
代理层进行分片路由

2 扩容

问题背景:
活动流量上涨
集群性能不满足要求
解决方案:
扩容DB物理节点数量
利用影子表进行压测

3 代理连接池

问题背景:
突增流量导致大量建联
大量建立导致负载变大, 延时上升
解决方案:
业务侧预热连接池
代理侧预热连接池
代理侧支持连接队列

4 高可用

三机房部署
    机房级别容灾
    机房级别流量调度
Proxy
    读写分离, 分库分表
    限流, 流量调度
监控报警
    实时监控集群运行状态
    提前上报集群风险
HA(High Availability)
    实时监控DB运行状态
    宕机快速切换