深入理解RDBMS丨青训营笔记
这是我参与「第五届青训营」笔记创作活动的第 19 天,也是本次活动的最后 1 天。
一、本堂课重点内容
RDBMS(关系型数据库)是目前使用最为广泛的数据库之一,同时也是整个信息化时代的基石。本节课程通过生活中常见的场景抖音春节红包雨来引入,展开对RDBMS的作用、发展历程、关键技术等详细内容的介绍。最后再次以红包雨为案例,展示了字节跳动应对大流量、流量突增、高可靠等问题的一些解决方案。
二、详细知识点介绍
1. 经典案例
春节期间,抖音平台推出红包雨活动,同时有很多的用户开抢红包,通过这个场景引出事务、高并发和高可靠等内容。
事务
事务(Transaction)是由一组SQL语句组成的一个程序执行单元(Unit),它需要满足ADID特性。
- 原子性(Atomicity):事务内的操作要么全做,要么不做
- 一致性(Consistency):事务执行前后,数据状态是一致的
- 隔离性(Isolation):可以隔离多个并发事务,避免影响
- 持久性(Durability):事务一旦提交成功,数据保证持久性
高并发(Concurrency)
高并发是指系统能够同时处理大量的请求或并发用户访问,通常用于描述在同一时间段内,系统可以处理的并发请求数量。
在高并发环境下,系统需要具备高效的性能、优秀的负载均衡和高可用性等特点,才能保证系统能够快速响应请求,提高用户体验。
高可靠(Availability)
高可靠性是指系统能够在各种情况下保持长时间稳定运行,即使在出现故障或异常情况时也能够自动恢复或提供备用方案。
一个高可靠的系统应该能够预防和容忍各种类型的故障,并且具备快速恢复和灾难恢复的能力,以保障系统运行的连续性和稳定性。
2. 发展历史
前 DBMS 时代
人工管理:结绳记事、账本、打孔机等
文件系统:软盘、磁盘等
DBMS 时代
网状模型:
是1960年代后期出现的一种改进的数据模型,它将数据组织成图形结构,每个节点可以有多个父节点和多个子节点。这种模型可以表示复杂的关系,但也增加了操作和维护的难度。
层次模型:
是最早的数据模型,它将数据组织成树形结构,每个节点有一个父节点和多个子节点。这种模型适合表示一对多的关系,但不适合表示多对多的关系。IBM在1960年代开发了世界上第一个层次模型数据库——IMS系统。
关系模型:
是1970年由E.F.Codd提出的一种革命性的数据模型,它将数据组织成表格形式,每个表格由行和列组成。这种模型简单而灵活,可以用数学逻辑来操作和查询数据。SQL是最常用的关系数据库语言。
三种 DBMS 模型对比:
SQL语言:
- 语法风格接近自然语言
- 高度非过程化
- 面向集合的操作方式
- 语言简洁,易学易用
3. 关键技术
SQL的执行流程
SQL引擎:
Parser
解析器(Parser)一般分为词法分析、语法分析、语义分析等步骤。
- 词法分析:将一条SQL语句对应的字符串分割为一个token,进行简单分类
- 语法分析:把词法分析的结果转化为语法树,根据token序列匹配不同的语法规则,根据语法规则匹配关键字,输出一个结构化的数据结构。
- 语义分析:对语法树中的信息进行合法性校验
Optimizer
优化器(Optimizer)会在所有可行的执行计划中选择最优的执行计划,以尽量减少查询所需的时间和资源消耗。
基于规则的优化
- 条件简化
- 表连接简化:总是小表先进行连接
- Scan优化
- 唯一索引
- 普通索引
- 全表扫描
基于代价的优化
例如,基于查询代价的优化:查询代价是指执行一个查询所需的时间和资源消耗。基于查询代价的优化会根据查询涉及的数据量、查询操作的复杂度和查询缓存等因素,估算查询的代价,并选择最优的查询执行计划。
Executor
执行器(Executor)是指一个用于执行SQL查询的模块,它接收优化器生成的查询执行计划,并在数据库中执行查询以产生结果。常见的执行方式是火山模型,如下图所示。
可以通过向量化和编译执行两种方式提高效率。
事务引擎
Atomicity 和 Undo Log
Undo Log是逻辑日志,记录数据的增量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制,解决读写冲突和一致性读的问题。
Isolation 和 锁
锁是实现事务隔离性的一种手段,它是用于保护共享资源的机制。在并发事务执行的过程中,如果多个事务同时访问同一资源,就会产生资源争用问题,从而导致数据的不一致性。
数据库管理系统中的锁可以分为共享锁(Share Lock)和排他锁(Exclusive Lock)。共享锁用于共享资源的读取,多个事务可以同时获取共享锁,但不能同时获取排他锁。排他锁用于修改共享资源,一旦一个事务获取了排他锁,其他事务就无法同时获取共享锁或排他锁。
Isolation 和 MVCC
Durability 和 Redo Log
Redo Log是物理日志,记录页面的变化,它的作用是保证事务的持久性。如果数据写入磁盘前发生故障,重启MySQL后会根据Redo Log重做。
存储引擎
InnoDB
Buffer Pool
存储引擎位于内存中的重要结构,用于缓存数据,减少磁盘IO的开销。
Page
数据存储的最基本单位,一般为16KB。
B+ Tree
InnoDB中最常用的索引结构。
4. 企业实践
以红包雨为案例,展示了字节跳动是如何解决大流量、流量突增、高可靠等问题的。
大流量 - Sharding
Sharding是一种数据库水平分割技术,也称为分库分表。它是指将一个大型的数据库分割成多个小的数据库,每个小的数据库称为一个分片(Shard),并将不同的分片分配到不同的物理节点上进行存储和查询。Sharding技术可以有效地解决单一数据库无法承载大量数据和高并发访问的问题,提高数据库的性能、可扩展性和可用性。
流量突增
- 扩容
- 代理连接池
稳定性 & 可靠性
- 3AZ高可用
- HA管理 HA(High Availability,高可用性)管理是指在分布式系统中,通过使用多个服务器和复杂的软件和硬件架构,以确保系统在出现故障或其他问题时可以持续运行。
三、课后个人总结
本节课的思维导图:
这是青训营创作笔记活动中发的最后一篇笔记了,不知不觉中,第五届字节跳动青训营就快要结束了,回顾这段时间,虽然每天听课,做项目,但是回想过来还是学到了很多,也更进一步领会到了字节跳动的魅力和后端开发的乐趣!
非常感谢一起陪伴我们走完这段短暂旅程的青训营老师们和我的同伴们,愿此次青训营能够成为我们成功路上的强力助手,伴我们一路前行!
且将新火试新茶!诗酒趁年华!