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

43 阅读2分钟

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

隔离性表现就像是串行进行的

核心模块

SQL 引擎 存储引擎 事务引擎

SQL 引擎

解析器 Parser

SQL --> 词法分析 --> 语法分析 --> 语义分析 词法分析:列出关键名、表名、运算符等 语义分析:合法性等

优化器

为什么需要优化器?

比如三个表中查找,先合并表 AB 更优还是先 AC 合并更优 总是小表先进行连接

基于代价的优化 CBO(cost base optimizer) 什么是代价:就是时间(要考虑整体,比如 IO、cpu 等)

Executor

逐层向下调用,逐层向上返回数据 每个算子独立实现

优化:

  1. 向量化 每次操作的是一批数据,这样 cpu cache 利用率高 可以利用 cpu 的 SIMD 机制(单指令多数据)

  2. 编译执行 利用 LLVM 动态编译执行技术

存储引擎 InnoDB

每次写数据并不是都写到 disk, 而是先写到 log buf

存储引擎 Page

二分 page directory + 遍历

存储引擎 B+树

页面内二分找,然后遍历该槽对应分组中的记录 叶子节点之间是双向链表结构

点查很快通过二分从根到叶 范围查可以到叶节点后,通过双向链表进行遍历

事务引擎

Undo Log

数据库回退到之前状态 -- 通过 undo log undo log 是逻辑日志,记录数据增量变化,从而保证事务原子性,同时也实现了多版本并发控制MVCC 解决读写冲突和一致性冲突

一致性

更多是业务上保证

隔离性和锁

读写冲突怎么办? 读读--两个人都想要共享锁 ok 写写--两个人都想要独占锁 not ok 读写--一人要共享锁,一人要独占锁

隔离性和 MVCC

意义:

  1. 读写互不阻塞
  2. 降低死锁概率
  3. 实现一致性读

实现一个数据从新版本到老版本的链表,这样可以通过读老版本的数据,实现读写同时进行

持续性和 Redo Log

如何永久化保存? 方案 1:事务提交前页面写 disk 问题:随机 IO、写放大 方案 2:WAL(write-ahead Log) redo log 是物理日志,记录页面变化,保证事务永久化。如果数据写 disk 前故障,重启 mysql 会根据 redo log 重做

实战

连接池:也可以避免 DB 被突增大流量打死 DB 扩容

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

3 个城市独立机房

HA 管理