【第一阶段总结】MySQL基础20天 —— 知识地图与避坑复盘
20天,从架构到锁,你的 MySQL 基础框架搭好了吗?
大家好,我是一名拥有10年以上经验的DBA老兵。
到今天,整整20天。我们从 MySQL 的架构讲到了行锁,从一条 SELECT 怎么跑的讲到了事务隔离级别怎么选。
如果这20天你是一路跟下来的,先给自己鼓个掌——基础阶段最难的部分你已经扛过去了。
今天在做新知识输入前,咱们干三件事:
- 把20天的知识串成一张地图,看看它们之间怎么互相咬合
- 复盘几个反复出现的"坑王"
- 看看下一阶段要往哪走
一张图看懂20天的知识结构
这20天的内容可以分成五个大块,它们是层层递进的关系:
### 第一阶段:MySQL 基础(第1-20天)
架构与通信流程→存储引擎
InnoDB vs MyISAM
↓
② 索引与SQL优化(Day 5-14)
B+树索引原理→WHERE / JOIN 优化
子查询 · GROUP BY · ORDER BY · LIMIT 深分页
↓
③ DML实战(Day 15-16)
INSERT 批量插入→UPDATE / DELETE 锁风险
↓
④ 事务(Day 17-19)
ACID 事务基础→隔离级别
RC / RR / Serializable
脏读 · 不可重复读 · 幻读 诊断与修复
↓
⑤ 锁(Day 20)
行锁 vs 全表锁定→Record · Gap · Next-Key Lock
↓
▶ 第二阶段:进阶(Day 21-40)
MVCC → 死锁 → 慢查询 → EXPLAIN → 索引深入 ...
五个块之间有清晰的依赖关系:
- 不理解 索引,就搞不懂 WHERE/JOIN 为什么慢,也理解不了行锁为什么挂在索引上
- 不理解 事务,就看不懂隔离级别和锁的配合
- 不理解 隔离级别,就不知道为什么 RC 下没有 Gap Lock、RR 下才有
所以如果你感觉哪天没跟上,回头补一下索引那几篇——那是一个分水岭。
五个"回头看最有价值"的知识点
如果这20天你只记住五件事,我推荐这五个:
1. WHERE 条件必须走索引,不只是为了快
这是我从 Day 6 一直念叨到 Day 20 的一句话。
不走索引的 UPDATE/DELETE,不是变慢的问题,是把整张表锁死的问题。Day 20 那个凌晨2点的故障就是典型——一个没索引的 status 字段,60万行全扫,锁了10分钟。
这个坑我见过不下十次。见过的DBA越多,越确认这是线上最频繁的锁故障,没有之一。
2. RR 下 DELETE 会删掉 SELECT 看不到的行
Day 19 讲的这个边缘场景,是所有知识点里最容易让人懵的。
原因一句话:SELECT 走快照读(读事务开始时的版本),DELETE 走当前读(读最新的已提交数据)。两个读的不是同一套数据,所以 SELECT 查不出来的行,DELETE 可能删得掉。这不是 bug,是 InnoDB 的设计。能理解这个的人,对 InnoDB 的事务模型才算真正入门了。
3. 隔离级别没有银弹
Day 18 和 Day 19 反复强调了一个观点:选隔离级别不是选"最好的",是选"你能接受哪个副作用"。
4. JOIN 不是越多越慢,而是不会用索引才慢
Day 10 讲过,NLJ 的效率取决于驱动表的选择和被驱动表的索引。很多人一看到 JOIN 就害怕,其实正确的 JOIN 比你写三个分开的查询再在代码里拼要高效得多。
5. 深分页不要用 OFFSET
Day 14 讲的分页优化,是我在工作里被问得最多的一个问题。limit 100000, 20 和 limit 20 的代价完全不是一个量级。游标分页 / 延迟关联,这两个方案记下来,面试和工作中都高频出现。
第一阶段的高频面试题汇总
这20天每篇都有面试考点,挑几个最高频的列出来,面试前看一眼:
关于索引:
- B+树为什么适合做索引?(高度低、范围查询快、磁盘IO少)— Day 5
- 什么情况下索引会失效?— Day 6
- 最左前缀原则是什么?— Day 9
关于SQL:
- 一条SELECT的执行流程是怎样的?— Day 8
- JOIN的三种算法(NLJ/BNL/Hash Join)区别?— Day 10
- GROUP BY 为什么慢?怎么优化?— Day 12
- LIMIT 深分页怎么优化?— Day 14
关于事务:
- 脏读、不可重复读、幻读的区别?— Day 19
- RC和RR怎么选?— Day 18
- MySQL RR级别到底防不防幻读?— Day 19
关于锁:
- 行锁挂在什么上?没索引会怎样?— Day 20
- Record Lock、Gap Lock、Next-Key Lock 的区别?— Day 20
进入第二阶段前的自测清单
在开始第二阶段之前,试着自己回答这几个问题。不需要全对,但如果超过3个答不上来,建议回头翻翻对应那天的文章:
- [ ]
SELECT * FROM t WHERE name = 'abc'在 name 没有索引时,InnoDB 会做什么?(Day 5-6) - [ ]
SELECT * FROM t1 JOIN t2 ON t1.id = t2.t1_id中,MySQL 怎么决定先查哪张表?(Day 10) - [ ] 为什么
LIMIT 100000, 20很慢,即使有索引?(Day 14) - [ ] RC 和 RR 在"事务内是否能看到别人刚提交的数据"上有什么不同?(Day 18)
- [ ] 一张表没有索引,UPDATE 会锁住多少行?(Day 20)
下阶段预告
第二阶段(Day 21-40)将进入 MySQL 进阶,围绕三个方向展开:
- InnoDB 内核 —— 事务、锁、日志的底层实现
- SQL 优化进阶 —— EXPLAIN 深度解读、索引失效全场景
- 运维基本功 —— 参数调优、Buffer Pool、表空间管理
第一阶段打的是"能用"的基础,第二阶段开始进入"懂原理"的深度。如果第一阶段有些概念还模糊,趁这两天休整翻一翻。基础越扎实,进阶越顺。
第二阶段即将开始——我们接着聊
有问题欢迎评论区交流,明天见!