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

隔离性表现就像是串行进行的
核心模块
SQL 引擎 存储引擎 事务引擎
SQL 引擎
解析器 Parser
SQL --> 词法分析 --> 语法分析 --> 语义分析 词法分析:列出关键名、表名、运算符等 语义分析:合法性等
优化器
为什么需要优化器?
比如三个表中查找,先合并表 AB 更优还是先 AC 合并更优 总是小表先进行连接
基于代价的优化 CBO(cost base optimizer) 什么是代价:就是时间(要考虑整体,比如 IO、cpu 等)
Executor
逐层向下调用,逐层向上返回数据 每个算子独立实现
优化:
-
向量化 每次操作的是一批数据,这样 cpu cache 利用率高 可以利用 cpu 的 SIMD 机制(单指令多数据)
-
编译执行 利用 LLVM 动态编译执行技术
存储引擎 InnoDB
每次写数据并不是都写到 disk, 而是先写到 log buf
存储引擎 Page
二分 page directory + 遍历
存储引擎 B+树
页面内二分找,然后遍历该槽对应分组中的记录 叶子节点之间是双向链表结构
点查很快通过二分从根到叶 范围查可以到叶节点后,通过双向链表进行遍历
事务引擎
Undo Log
数据库回退到之前状态 -- 通过 undo log undo log 是逻辑日志,记录数据增量变化,从而保证事务原子性,同时也实现了多版本并发控制MVCC 解决读写冲突和一致性冲突
一致性
更多是业务上保证
隔离性和锁
读写冲突怎么办? 读读--两个人都想要共享锁 ok 写写--两个人都想要独占锁 not ok 读写--一人要共享锁,一人要独占锁
隔离性和 MVCC
意义:
- 读写互不阻塞
- 降低死锁概率
- 实现一致性读
实现一个数据从新版本到老版本的链表,这样可以通过读老版本的数据,实现读写同时进行
持续性和 Redo Log
如何永久化保存? 方案 1:事务提交前页面写 disk 问题:随机 IO、写放大 方案 2:WAL(write-ahead Log) redo log 是物理日志,记录页面变化,保证事务永久化。如果数据写 disk 前故障,重启 mysql 会根据 redo log 重做
实战
连接池:也可以避免 DB 被突增大流量打死 DB 扩容
稳定性 & 可靠性 3AZ 高可用
3 个城市独立机房