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

87 阅读5分钟

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

通过今天的学习,深入的理解了RDBMS,并从一条SQL的一生出发,窥探了SQL引擎的内部组件:解析器,优化器和执行器,再到MySQL的InnoDB存储引擎,以及组成它的BufferPool,Page以及索引的数据结构B+树,最后从字节的红包雨活动了解到了怎么在大流量高并发的情况下保证RDBMS的稳定性

一、经典案例

通过抖音春节红包活动的一个小场景:

image.png

假想,如果抖音账户上扣除了一个小目标,但是羊老师账户上并未增加一个小目标,那抖音岂不是血亏一个小目标,羊老师的一个小目标也不翼而飞了

RDBMS事务ACID特性

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

  • 原子性(Atomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。

  • 一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

  • 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。

  • 持久性(Durability):在事务完成以后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。

若数据库中没有事务这种特性存在,红包雨活动带来的问题又许多:

image.png

image.png

image.png

image.png

image.png

image.png

二、发展历史

人工管理 -> 文件系统 -> DBMS时代

数据库发展最初过程中,诞生过3种数据模型,最终关系型模型成为了应用最为广泛的数据库模型。

  • 网状模型:用有向图表示实体和实体之间的联系的数据结构模型称为网状数据模型。
  • 层次模型:层次数据模型是用树状<层次>结构来组织数据的数据模型。
  • 关系模型:使用表格表示实体和实体之间关系的数据模型称之为关系数据模型。

image.png

SQL语言

image.png

三、关键技术

一条SQL的一生

在SQL执行过程中,需要经历SQL引擎、存储引擎、以及事务引擎等模块。而其中SQL引擎又分为Parser、Optimizer、Executor几个部分:

image.png

解析器-Parser

image.png

优化器-Optimizer

  • 条件化简
  • 表连接小表先连接
  • Scan优化

image.png

image.png

执行器-Executor

根据计划树进行执行,常见的执行方式是火山模型。

image.png

存储引擎

MySQL中有很多种存储引擎,MySQL5.6之前默认存储引擎为MyIsam,但在5.6之后的的版本MySQL默认存储引擎为Innodb,后者具有支持事务,支持外键,支持行级锁以及崩溃恢复等特性,是目前比较优秀的存储引擎

存储引擎负责了数据的底层存储、管理和访问工作。各大RDBMS存储引擎的设计都有不少的差异,这里选择MySQL的InnoDB存储引擎来向大家做一个介绍:

image.png

  • Buffer Pool:存储引擎位于内存中的重要结构,用于缓存数据,减少磁盘IO的开销。

image.png 当buffer pool里的页面都被使用之后,再需要换存其他页面怎么办?淘汰已有的页面 基于什么规则淘汰:淘汰那个最近一段时间最少被访问过的缓存页了,这种思想就是典型的 LRU 算法。 普通的LRU算法存在缺陷,考虑我们需要扫描100GB的表,而我们的buffer pool只有1GB,这样就会因为全表扫描的数据量大,需要淘汰的缓存页多,导致在淘汰的过程中,极有可能将需要频繁使用到的缓存页给淘汰了,而放进来的新数据却是使用频率很低的数据。 MySQL 确实没有直接使用 LRU 算法,而是在 LRU 算法上进行了优化。 MySQL 的优化思路就是:对数据进行冷热分离,将 LRU 链表分成两部分,一部分用来存放冷数据,也就是刚从磁盘读进来的数据,另一部分用来存放热点数据,也就是经常被访问到数据。 当从磁盘读取数据页后,会先将数据页存放到 LRU 链表冷数据区的头部,如果这些缓存页在 1 秒之后被访问,那么就将缓存页移动到热数据区的头部;如果是 1 秒之内被访问,则不会移动,缓存页仍然处于冷数据区中。 淘汰时,首先淘汰冷数据区。 image.png

  • Page:数据存储的最基本单位,一般为16KB。

image.png

  • B+ Tree:InnoDB中最常用的索引结构。

image.png

事务引擎

事务引擎实现了数据库的ACID能力,这里还是以MySQL的InnoDB为例来介绍数据库内部是通过哪些技术来实现ACID:

  • Atomicity:InnoDB中通过undo日志实现了数据库的原子性,通过Undo Log,数据库可以回滚到事务开始的状态;

image.png

  • Isolation:通过Undo Log实现MVCC(多版本并发控制),降低读写冲突。

image.png

image.png

  • Durability:通过Redo Log(一种WAL实现方式)来保证事务在提交后一定能持久化到磁盘中。

image.png

  • Consistency:一致性本质上是一种业务层的限制

四、企业实践

字节中是国内数据规模最大的互联网公司之一,公司内部有成千上万套RDBMS系统。拿春节红包雨活动为例,字节跳动是如何在大流量,流量突增和高并发下实现数据库的稳定性的:

分库分表 image.png

数据库集群(主从复制) image.png

代理连接池 image.png

稳定性&可靠性

image.png