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

71 阅读9分钟

MySQL - 深入理解RDBMS

这是我参加【第五届青训营】伴学笔记创作活动的第16天

课程目录

屏幕截图 2023-02-13 202210.png

课程目标

  1. 经典案例
  2. 发展历史
  3. 关键技术
  4. 企业实践

经典案例

屏幕截图 2023-02-13 164914.png

RDBMS事务 ACID

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

屏幕截图 2023-02-13 165018.png

ACID :
  • 原子性(Atomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
  • 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
  • 持久性(Durability):在事务完成以后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。

红包雨与ACID

case 1:抖音的账户上扣了一个亿之后,假设服务器挂了,还没来得及给羊老师账户上加一个亿

屏幕截图 2023-02-13 165113.png

原子性 Atomicity :两个操作要么同时成功,要么同时失败,不存在中间状态。

case 2:假设抖音的账户上只有0.5个亿,但是扣减一个亿的操作成功了

屏幕截图 2023-02-13 165152.png 一致性 Consistency:每个操作都必须是合法的,账户信息应该从一个有效的状态变为另一个有效的状态

case 3:羊老师从抖音抢了一个亿红包,又从头条上抢了一个亿,两个转帐同时进行,假设他们都以为是从零开始更新羊老师的账户余额,羊老师最后得到一个亿

屏幕截图 2023-02-13 165256.png

隔离性 Isolation:两个操作在对同一个账户并发进行操作时,应该是相互不影响,表现的像是串行操作

case 4:抖音的账户上扣了一个亿,然后羊老师账户上加了一个小目标,但还没写到磁盘上,这个时候,如果服务器挂了 屏幕截图 2023-02-13 165339.png

持久性 Durability:操作更新成功之后,更新的结果应该永久性的保留下来,不会因为宕机等问题而丢失

屏幕截图 2023-02-13 165506.png

屏幕截图 2023-02-13 165548.png

发展历史

前DBMS时代-人工管理

  • 结绳记事
  • 清代钱庄账本
  • 用于1890年人口普查的霍列瑞斯式的打孔机

效率太低

前DBMS时代-文件系统

1950s,现代计算机的雏形基本出现。1956年 IBM 发布了第一个的磁盘驱动器-- Model 305 RAMAC ,从此数据存储进入磁盘时代。在这个阶段,数据管理直接通过文件系统来实现。

DBMS时代

  • 1960s,传统的文件系统已经不能满足人们的需要,数据库管理系统( DBMS )应运而生。
  • DBMS :按照某种数据模型来组织、存储和管理数据的仓库。
  • 所以通常按照数据模型的特点将传统数据库系统分成网状數据库、层次數据库和关系數据库三类。

DBMS数据模型-网状模型

网状数据库所基于的网状数据模型建立的数据之间的联系,能反映现实世界中信息的关联,是许多空间对象的自然表达形式。
1964年,世界上第一个数据库系统﹣﹣集成数据存储( Integrated Data Storage , IDS )诞生于通用电气公司。 IDS 是世界上第一个网状数据库,奠定了数据库发展的基础,在当时得到了广泛的应用。在1970s网状数据库系统十分流行,在数据库系统产品中占据主导地位。 屏幕截图 2023-02-13 170020.png

DBMS数据模型-层次模型

1968年,世界上第一个层次数据库﹣﹣信息管理系统( Information Management System , IMS )诞生于IBM公司,这也是世界上第一个大型商用的数据库系统。层次数据模型,即使用树形结构来描述实体及其之间关系的数据模型。 屏幕截图 2023-02-13 170131.png

DBMS数据模型-关系模型

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

1979年 Oracle 首次将关系型数据库商业化,后续DB2, SAP Sysbase ASE , and Informix 等知名数据库产品也纷纷面世。

屏幕截图 2023-02-13 170328.png

DBMS数据模型

屏幕截图 2023-02-13 170410.png

SQL语言

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

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

屏幕截图 2023-02-13 170703.png

历史回顾

屏幕截图 2023-02-13 170906.png

关键技术

一条SQL的一生

屏幕截图 2023-02-13 171330.png

SQL引擎-Parser

解析器(Parser)一般分为词法分析(Lexical analysis)、语法分析(Syntax analysis)、语义分析(Semantic analyzer)等步骤 屏幕截图 2023-02-13 171546.png

SQL引擎-Optimizer

为什么需要一个优化器(Optimizer)

屏幕截图 2023-02-13 171759.png

基于规则的优化( RBO Rule Base Optimizer )
  • 条件化简
    a =5 and b > a 
    a >5 and a < b and b =1 ——>a =5 and b >5 FALSE

  • 表连接优化

    • 总是小表先进行连接
  • Scan 优化

    • 唯一索引
    • 普通索引
    • 全表扫描

数据库索引:是数据库管理系统中辅助数据结构,以协助快速查询、更新数据库表中数据。目前数据库中最常用的索引是通过 B +树实现的。

基于代价的优化(CBO Cost Base Optimizer)

一个查询有多种执行方案,CBD会选择其中代价最低的方案去真正的执行

什么是代价

  • 时间
  • IO
  • CPU
  • NET-网络
  • MEM-内存

SQL引擎-Executor

屏幕截图 2023-02-13 172453.png

每个 Operator 调用 Next 操作,访问下层 Operator ,获得下层 Operator 返回的一行数据,经过计算之后,将这行数据返回给上层。

  • 优点
    • 每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单
  • 缺点
    • 每计算一条数据有多次函数调用开销,导致 CPU 效率不高。

屏幕截图 2023-02-13 172653.png

每个 Operator 每次操作计算的不再是一行数据,而是一批数据( Batch N 行数据),计算完成后向上层算子返回一个 Batch 。

  • 优点
    • 函数调用次数降低为1/N
    • CPU cache 命中率更高
    • 可以利用 CPU 提供的 SIMD ( Single Instruction Multi Data )机制。

屏幕截图 2023-02-13 172805.png

将所有的操作封装到一个函数里面,函数调用的代价也能大幅度降低。

用户 SQL 千变万化怎么办?难道要穷举用户的所有 SQL ,给每一个 SQL 都预先写好一个执行函数吗?

LLVM 动态编译执行技术

存储引擎-InnoDB

屏幕截图 2023-02-13 200624.png

In-Menmory:

  • Buffer Pool
  • Change Buffer
  • Adaptive Hash Index
  • Log Buffer

On-Disk:

  • System Tablespace(ibdata1)
  • General Tablespaces(xxx.ibd)
  • Undo Tablespaces(xxx.ibu)
  • Temporary Tablespaces(xxx.ibt)
  • Redo Log(ib_logfileN)

存储引擎-Buffer Pool

屏幕截图 2023-02-13 201123.png

屏幕截图 2023-02-13 201159.png

存储引擎-Page

屏幕截图 2023-02-13 201339.png

存储引擎-B+ Tree

屏幕截图 2023-02-13 201416.png 页面内: 夜目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录

从根到叶: 中间节点存储

点查

select * from table where id=2000;

范围查询

Select * from table where id>2000;

事务引擎-Atomicity与Undo Log

屏幕截图 2023-02-13 201530.png

事务引擎-Isolation 与MVCC

屏幕截图 2023-02-13 201638.png

MVCC的意义:

  • 读写互不阻塞
  • 降低死锁概率
  • 实现一致性读

Undo Log在MVCC的作用:

  • 每个事务有一个单增的事务ID
  • 数据页的行记录中包含了DB_ROW_ID,DB_TRX_ID,DB_ROLL_PTR
  • DB_ROLL_PTR将数据行的所有快照记录都通过链表的结构串联了起来

事务引擎-Durability与Redo Log

如何保证事务结束后,对数据的修改永久的保存?

  • 事务提交前页面写盘   - 随机IO、写放大

  • WAL(Write-ahead logging)   - redo log 是物理日志,记录的是页面的变化,它的作用是保证事务持久化,如果数据写入磁盘前发生故障,重启MySQL后会根据redo log 重做

企业实践

春节红包雨挑战

  • 流量大
  • 流量突增
  • 稳定性

大流量-Sharding

问题背景

  • 单节点写容易成为瓶颈
  • 单机数据容量上限

解决方案

  • 业务数据进行水平拆分
  • 代理层进行分片路由

实施效果

  • 数据库写入性能线性扩展
  • 数据库容量线性扩展

屏幕截图 2023-02-13 201907.png

流量突增一扩容

问题背景

  • 活动流量上涨
  • 集群性能不满足要求

解决方案

  • 扩容 DB 物理节点数量
  • 利用影子表进行压测

实施效果

  • 数据库集群提供更高的吞吐
  • 保证集群可以承担预期流量

屏幕截图 2023-02-13 202019.png

流量突增﹣代理连接池

问题背景

  • 突增流量导致大量建联
  • 大量建联导致负载变大,延时上升

解决方案

  • 业务侧预热连接池
  • 代理侧预热连接池
  • 代理侧支持连接队列

实施效果

  • 避免 DB 被突增流量打死
  • 避免代理和 DB 被大量建联打死

稳定性&可靠性-3AZ高可用

屏幕截图 2023-02-13 202122.png

  • 三机房部署
    - 机房级别容灾
    - 机房级别流量调度
  • proxy 
    - 读写分离,分库分表
    - 限流,流量调度
  • 监控报警
    - 实时监控集群运行状态   - 提前上报集群风险

稳定性&可靠性- HA 管理

问题背景

  • db 所在机器异常宕机
  • db 节点异常宕机

解决方案

  • ha 服务监管、切换宕机节点
  • 代理支持配置热加载
  • 代理自动屏蔽宕机读节点

总结

这节课主要讲了关系型数据库,RDBMS(关系型数据库)是目前使用最为广泛的数据库之一,同时也是整个信息化时代的基石。本节课程通过生活中常见的场景介绍RDBMS的作用、发展历程及其核心技术,最后以字节为例,展示了RDBMS的企业级实践。