主题
MySQL 技术栈总览
蒸馏自
语雀-Java开发/MySQL/(丁奇《MySQL实战45讲》45 篇 + 从0到1 29 篇 + 最佳实践 5 篇)+github-hxq-note/数据库/MySQL(底层原理 33 篇 + 拓展 7 篇),约 120 篇源码级深度长文。本页是 MySQL 域全局地图。
一句话机制
MySQL 分 Server 层(连接/解析/优化/执行)和存储引擎层(InnoDB 默认);理解 MySQL = 吃透五条主线——架构(一条 SQL 怎么执行)、索引(B+ 树怎么加速)、事务(MVCC 怎么隔离)、锁(并发怎么控制)、日志(redo/undo/binlog 怎么保证不丢)。
MySQL 全景五主线
| 主线 | 核心问题 | 关键机制 | 详情页 |
|---|---|---|---|
| 架构 | 一条 SQL 怎么跑 | Server 层 + 存储引擎层;连接器→分析器→优化器→执行器 | 概念卡片:MySQL架构与SQL执行流程 |
| 索引 | 查询怎么加速 | B+ 树、聚簇/二级索引、回表、覆盖索引、页分裂 | 概念卡片:MySQL索引与B+树 |
| 事务 | 并发怎么隔离 | 4 隔离级别、MVCC、undo log、Read View | 概念卡片:MySQL事务与MVCC |
| 锁 | 并发怎么控制 | 两阶段锁、行锁、间隙锁、死锁检测 | 概念卡片:MySQL锁机制 |
| 日志 | 数据怎么不丢 | redo/undo/binlog、WAL、两阶段提交 | 概念卡片:MySQL日志与两阶段提交 |
架构一句话
MySQL = Server 层(连接器/查询缓存/分析器/优化器/执行器,通用)+ 存储引擎层(InnoDB/MyISAM/Memory,插件式)。Server 层负责功能,引擎层负责存取;所有引擎共用同一个 Server 层。
索引一句话
InnoDB 用 B+ 树索引(N 叉树,N≈1200,树高 4 可存 17 亿)。主键索引(聚簇)叶子存整行,二级索引叶子存主键值;用二级索引查数据要「回表」再查主键树。主键越短,二级索引越小 → 优先自增整型主键。
事务一句话
4 隔离级别:读未提交/读已提交/可重复读/串行化。InnoDB 用 MVCC(undo log 回滚日志 + Read View 一致性视图)实现「可重复读」——同一条记录在系统里有多个版本,不同事务看到不同版本。
锁一句话
行锁遵循两阶段锁协议(需要时加、事务结束才释放)→ 把冲突大的锁往后放。死锁靠 innodb_deadlock_detect 主动检测,但热点行更新时死锁检测 O(n²) 会吃掉 CPU。
日志一句话
WAL(Write-Ahead Logging):先写日志再写磁盘。redo log(InnoDB 物理日志,循环写,crash-safe)+ binlog(Server 逻辑日志,追加写,归档/主从)。更新用两阶段提交保证 redo/binlog 逻辑一致。
常见误解(避坑)
- ❌ "MyISAM 和 InnoDB 只是速度差别"。→ MyISAM 不支持事务、不支持行锁,只有表锁;这是它被 InnoDB 取代的根本原因。
- ❌ "所有引擎的索引都一样"。→ 索引是引擎层实现的,MyISAM 用 B+ 树但叶子存数据地址,InnoDB 是索引组织表(叶子存数据本身)。
- ❌ "查询缓存能加速就用"。→ 查询缓存失效极频繁(一有更新全表缓存清空),且 8.0 已移除。
- ❌ "redo log 和 binlog 是同一回事"。→ 一个引擎层物理日志(崩溃恢复)、一个 Server 层逻辑日志(归档/主从),两阶段提交协调两者。
关联
- 原始资料:丁奇《MySQL实战45讲》(01-45)·
github-hxq-note/数据库/MySQL(底层原理 33 篇) - 概念卡:概念卡片:MySQL架构与SQL执行流程 · 概念卡片:MySQL索引与B+树 · 概念卡片:MySQL事务与MVCC · 概念卡片:MySQL锁机制 · 概念卡片:MySQL日志与两阶段提交
- 相关:Redis技术栈总览(同为数据与存储域)
- 域地图:A00-百科/数据与存储/数据与存储