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

75 阅读4分钟

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

深入理解 RDBMS

前置概念

  • 事务
    • 简介: 一组具有 ACID 特性 的操作。
    • 解读
      • A(原子性):
        • 事务的所有操作要么都成功,要么都失败。
      • C(一致性):
        • 事务执行前后,数据状态是一致的,符合预期的。
      • I(隔离性):
        • 定义并发事务间的隔离级别。
      • D(持久性):
        • 已经提交的事务不会丢失。
  • 高并发
    • 能够同时处理大的请求。
  • 高可靠
    • 提供的服务不会宕机。

发展历史

  • 前 DBMS 时代 - 人工管理
  • 前 DBMS 时代 - 文件系统
    • 通过文件存数据,数据过于庞大后,更新、检索数字不便。
  • DBMS 时代
    • 按照某种数据模型,组织、管理数据的仓库。
      • 常见数据模型
        • 网状模型
        • 层次模型
        • 关系模型
  • SQL 语言诞生
    • 简介
      • 结构化查询语言,用来语义化操作数据库的。
    • 特点
      • 语法风格接近自然语言。
      • 高度非过程化。
      • 面对集合的操作方式。
      • 语言简洁、简单易用。

关键技术

一条 SQL 执行的流程

  • SQL 命令发给数据库。
  • 语法解析:
    • 语法解析器将 SQL 语言生成语法树(AST)。
  • 优化:
    • 优化器根据语法树生成具体执行方案(Plan)。
  • 执行:
    • 执行器根据执行方案(Plan)执行。
    • 执行器文件中读取/写入数据,并写入日志。
  • 返回客户端。

SQL 引擎

解析器

三个阶段

  • 词法分析:
    • 解析 SQL 中保留字,生成关键词。
  • 语法分析:
    • 将关键词生成语法树(AST)。
  • 语义分析:
    • 判断上下文相关的信息是否正确(判断合法性)。

优化器

  • 简介:
    • 选择表连接顺序 / 是否走索引。选择最优的执行方案。
  • 类别:
    • 基于规则的优化器:
      • 常见规则:
        • 总是小表先连接。
        • 尽量走索引。
    • 基于代价的优化器:
      • 代价:
        • 硬件资源:IO、CPU、NET、MEM。
        • 整体并发最优。

执行器

  • 执行模型:
    • 火山模型:
      • 简介:
        • 调用时逐层向下调用,返回时逐级返回
        • image.png
      • 特点:
        • 每一层相互独立,相互没有耦合,逻辑结构简单。
        • 一条数据需要多个函数调用,CPU 效率不高。
    • 向量化
      • 简介:
        • 每次操作不是一行一行的返回,而是一批一批返回。
        • image.png
      • 特点:
        • 一批一批返回,函数调用次数下降。
        • 一次返回一批数据,CPU 可以更好利用缓存。
        • 可以
    • 编译执行:
      • 简介:
        • 将所有优化器代码写到一个函数中,动态编译后执行,从而减少函数调用
      • 特点;
        • 动态编译,有选择的编译代码。

存储引擎 - InnoDB

  • 整体架构图
    • image.png
    • 内存中部分:
      • Buffer Pool
      • Log Buffer
    • 磁盘中部分:
      • System Tablespace(ibdata1文件):
        • 系统表,用来存储元数据。比如用户自建表的名字、索引信息、数据信息。
      • General Tablespace(xxx.ibd 文件):
        • 普通表,用来存储用户自建表。
      • Undo Tablespace(xxx.ibu 文件):
        • undo 表,用来存储 undo 日志。
      • Redo log
        • 用来存储 Redo log。
      • Temporary Tablespace(xxx.ibd):
        • 临时表空间,用来存储表连接操作中间结果。
      • Doublewrite Buffer Files(xxx.dblwr文件)
        • 双写日志buffer文件。
  • Buffer Pool:
    • 存储结构:
      • image.png
      • 存储单元由小到大:
        • block:
          • 一个页面大小为 16K。
        • chunk:
          • 一个 chunk 包含 8192 个 block,共计128K,Buffer Pool 以 chunk 为基本单位申请内存。
        • instance:
          • 一个 instance 包含多个 chunk。instance 将不同 chunk 进行分组。
          • 用户访问时可以按照分组进行访问,从而减少冲突。
    • 数据结构1:HashMap<page_id, block*>
      • 图示:
        • image.png
      • 用途:
        • 通过 page_id 快速找到所在 block。
        • 对 page_id 进行hash,判断在哪个 hash 桶中,来快速查找。
    • 数据结构2:LRU
      • 图示:
        • image.png
      • 用途:
        • 磁盘容量远远大于内存,通过 LRU 数据结构,将内存中不常用数据淘汰。
  • Page:
    • 简介:
      • buffer pool 的 block 概念,对应到磁盘中就是 page,page 默认大小 16K。
    • 记录存储格式:
      • image.png
      • 变长字段列表:
        • 给定边长字段的位置及长度。
      • NULL 值标志位:
        • 用来标记哪些为空。
      • Header
        • 记录该记录元信息。是否被删除,下一条数据位置,当前记录类型。
      • row_id:
        • 行 id。
      • trx-id:
        • 事务 id。
      • roll-ptr
        • 回滚指针。
    • page 存储格式:
      • image.png
      • Page Header:
        • page 元数据。
      • User Records:
        • 用户记录。
      • Free Space:
        • 空闲空间。
      • Page Directory:
        • 图示:
          • image.png
        • page 索引,多个 Page 的 page directory 共同构成 B+ 来优化扫描。
      • FIL Trailer
  • B+ Tree:
    • 简介: Page Directory 共同组成 B+ 树来优化查询效率。
    • 图示:
      • image.png