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

101 阅读5分钟

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

MySQL - 深入理解RDBMS

经典案例

RDBMS 事务ACID

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

ACID

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

发展历史

前DBMS时代 - 人工管理

image.png

前DBMS时代 - 文件系统

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

image.png

DBMS时代

1960s,传统的文件系统已经不能满足人们的需要,数据库管理系统(DBMS)应运而生

DBMS:按照某种数据模型来组织、存储和管理数据库的仓库

所以通常按照数据模型的特点将传统数据库系统分成网状数据库、层次数据库和关系数据库三类

image.png

DBMS数据模型 - 网状数据库

网状数据库所基于的网状数据模型建立的数据之间的联系,能反映现实世界中信息的关联,是许多空间对象的自然表达式

image.png

DBMS数据模型 - 层次模型

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

image.png

DBMS数据模型 - 关系模型

1970年,IBM的研究院提出了关系模型的概念,奠定了关系模型的理论基础。1979年Oracle首次将关系型数据库商业化

image.png

DBMS数据模型

网状模型

优势

  • 能直接描述现实世界
  • 存取效率较高

劣势

  • 结构复杂
  • 用户不易使用
  • 访问程序设计复杂

层次模型

优势

  • 结构简单
  • 查询效率高
  • 可提供较高的完整性支持

劣势

  • 无法表示M:N的关系
  • 插入、删除限制多
  • 遍历子节点必须经过父节点
  • 访问程序设计复杂

关系模型

优势

  • 实体及实体间的联系都通过二维表结构表示
  • 可以方便的表示M:N关系
  • 数据访问路径对用户透明

劣势

  • 关联查询效率不够高
  • 关系必须规范化

SQL语言

SQL(Structured Query Language)语言

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

历史回顾

image.png

关键技术

一条SQL的一生

image.png

SQL引擎 - Parser

解析器(Parser)一般分为词法分析(Lexical analysis)、语言分析(Syntax analysis)、词法分析(Semantic analyzer)等步骤

image.png

SQL引擎 - Optimizer

基于规则的优化(RBO Rule Base Optimizer)

  • 条件简化

image.png

  • 表连接优化
    • 总是小表先进行连接
  • Scan优化
    • 唯一索引
    • 普通索引
    • 全表扫描
      数据库索引:是数据库管理系统中辅助数据结构,以协助快速查询、更新数据库表中数据。目前数据库中最常用的索引是通过B+树实现的

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

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

image.png

SQL引擎 - Executor

火山模型

image.png

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

优点:每个算子独立抽象实现,互相之间没有耦合,逻辑结构简单

缺点:每计算一条数据有多次函数调用开销,导致CPU效率不高

向量化

image.png

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

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

编译执行

image.png

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

LLVM动态编译执行技术

存储引擎 - InnoDB

image.png

  • In-Memory

    • Buffer Pool
    • Change Buffer
    • Adaptive Hash Index
    • Log Buffer
  • On-Disk

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

存储引擎 - Buffer Pool

image.png

image.png

存储引擎 - Page

image.png

存储引擎 - B+Tree

image.png

事务引擎 - Atomicity与Undo Log

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

事务引擎 - Isolation与锁

image.png

事务引擎 - Isolation与MVCC

MVCC的意义:

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

Undo Log在MVCC的作用:

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

image.png

事务引擎 - Durability与Redo Log

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

方案一:事务提前页面写盘

image.png

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

总结

image.png