深入理解 RDBMS | 青训营笔记

98 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记

一、经典案例——红包雨

需求:将金额从一个账户转移到另一个账户。

需要考虑的问题:一个账户在扣除金额后另一个账户能正确地获得金额。因此在数据库层面需要用到事务。

事务(transaction):是由一组SQL语句组成的一一个程序执行单元(Unit) ,它需要满足ACID特性。

其他需要考虑的问题:能够负载大量请求(高并发);服务器的稳定性尽量高,在关键时间节点不能宕机(高可用)

二、发展历史

数据库管理系统(DBMS)的诞生。根据模型特点可以分为:网状模型,层次模型,关系模型。

简单理解:网状模型——图;层次模型——树;关系模型——二维表(关系型数据库的模型)

三、数据库技术

SQL查询机制

SQL执行流程:请求->服务端->数据库->解析器(parser)->优化器(Optimizer)->执行器(Executor)->数据文件,日志文件->返回结果

SQL引擎部分:

解析器:经过词法分析、语法分析生成语法树

优化器:根据生成的语法树,选择一个最优的执行方案并生成计划树

执行器:根据优化器的计划树执行

数据库存储引擎

InnoDB:MySQL中常用的存储引擎。由内存部分和磁盘部分组成。内存部分有:缓冲池,自适应哈希等。磁盘部分有Undo日志,Redo日志等。

对于数据库存储引擎来说:通用的思想是采用缓存技术,因为缓存相比从磁盘读取数据其速度能够快一个数量级

缓冲池(Buffer Pool):可以简单理解为一种HashMap;考虑到可能有超过内存负载的量级数据,采用LRU淘汰算法将过时数据淘汰,Innodb采用了一种优化后的LRU算法。

页(Page):Innodb中数据存储的最基本单位,一般为 16KB。页中的每一行数据会有trx_id字段,表示事物id,roll_ptr字段表示回滚指针。这些字段在处理事务时会用到。

B+树:索引的常见底层数据结构。配合页(Page)可以快速定位需要数据的范围。增加查询效率。

数据库事务引擎

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

锁的几种情况:

读读:加读锁没有影响

写写:加锁,互斥,阻塞

读写:使用MVCC,让读写互不阻塞,降低死锁概率

四、企业实践

问题1:在数据量级很大(如PB级别)时,单个数据库几乎不可能存储这么多的数据。同时这么大的数据在读写消耗非常大。

方案:拆分数据(如分库分表),利用代理将数据分配到各个数据库中。

问题2:随着业务发展,数据库的访问量上升,原本的服务器无法满足需求。

方案:数据库扩容(分配更多数据库),利用影子表进行压测提前模拟环境。若访问量突然激增,对于代理可用预热连接池,连接队列

提升可靠性:部署备用服务器容灾,加强检测预防突发情况,采用代理。