MySQL 专栏导览
标签
中间件/MySQL
字数
1042 字
阅读时间
5 分钟
这一栏收录 MySQL 与 InnoDB 的内部机制:一条 SQL 怎么被解析、优化、执行,数据落在磁盘上的哪个位置,索引为什么是 B+ 树,并发事务之间怎么互不干扰,以及崩溃之后数据为什么还在。
| 不收 | 去哪看 | 本专栏只关心 |
|---|---|---|
| 分布式数据库、分库分表与中间件选型 | 分布式/分布式存储 | 单机 MySQL 与 InnoDB 的内部机制 |
| SQL 语法教程、函数手册、备份与部署流程 | MySQL 官方手册 | 一条语句在引擎内部怎么被执行 |
| 消息队列的投递语义与顺序保证 | 中间件/MQ | 事务、锁、日志、索引、Buffer Pool |
| 操作系统的页缓存、IO 调度与文件系统 | 基本功 | InnoDB 在通用机制之上自己实现了哪一套 |
目录
- 01 · 01-MySQL 架构与执行流程 —— Server 层与引擎层的分工、一条
SELECT从连接到返回经过哪几个阶段,以及一条UPDATE多走的那条链路:Buffer Pool 改内存、undo 留回滚、redo 与 binlog 两阶段提交 - 02 · 02-InnoDB 存储结构:表空间、页与行格式 —— 段 / 区 / 页三级结构、16KB 数据页的字节级布局与页目录的稀疏槽查找、四代行格式的对照、
varchar(n)上限的算式与行溢出的处理 - 03 · 03-索引与 B+ 树 —— 从二分查找到 B+ 树的选型推导(每代差在哪,用树高算出来)、聚簇与二级索引的叶节点差异与回表代价、最左匹配的 B+ 树解释、「2000W 行」这个估算的算式与它依赖的前提
- 04 · 04-索引失效与查询优化 —— 七类索引失效各自破坏了哪一层有序性、
count四种写法的扫描差异与 InnoDB 为什么不能维护行数、深度分页的两种执行路径与三种优化方案的边界 - 05 · 05-事务隔离与 MVCC —— ACID 各自靠什么实现、Read View 的四个字段与完整的可见性判定算法、RC 与 RR 的差别只在 Read View 的生成时机、幻读的两个成因分属 MVCC 与间隙锁
- 06 · 06-锁、加锁分析与死锁 —— 全局锁 / 表级锁 / 元数据锁 / 行级锁的层次、五种情形下加锁范围的完整推导、
update无索引为什么锁全表、两个死锁案例的成环复盘与排查路径 - 07 · 07-日志、Buffer Pool 与崩溃恢复 —— Buffer Pool 的改进型 LRU 与它为什么抗得住全表扫描、undo / redo / binlog 三者的分工、两阶段提交的崩溃点分析、刷脏与刷日志的参数取舍
阅读顺序
01 → 02 → 03 → 04 → 05 → 06 → 07。这条顺序是一条依赖链,不按热门程度排。
01 给全局骨架,后面每一篇都在往下钻一层。02 是 03 的载体 —— 不了解页与行格式,就说不清 B+ 树的叶节点里到底存了什么;03 是 04 的前提 —— 索引失效的每一类都要回到「B+ 树上的有序性」,而 04 的深度分页与 count 优化又直接用到 03 的结论。05 与 06 是一组:事务隔离由 MVCC 与锁两套机制共同实现,只读 05 会以为 MVCC 包办了一切,只读 06 又不知道为什么需要间隙锁。07 放在最后,因为 Buffer Pool、redo、binlog 都在「写入路径」上,读完前面几篇才知道一条 UPDATE 改的是哪一层。
相关
- 06-Aurora —— 把 MySQL 的计算与存储分离之后长成什么样,与本专栏的单机形态互为对照
参考
- 小林coding. 图解 MySQL v2.0. https://xiaolincoding.com/mysql/
- Oracle. MySQL 8.0 Reference Manual. https://dev.mysql.com/doc/refman/8.0/en/
YJ