P3 · 数据库深入(W11-16)
目标:能设计索引、处理事务与并发问题;能设计 Redis 缓存架构 验收:能完成一份 MySQL+Redis 选型设计方案
一、本阶段核心知识点
A. MySQL(重点)
1. 架构与存储
- MySQL 整体架构:连接器 → 分析器 → 优化器 → 执行器 → 存储引擎
- InnoDB vs MyISAM(事务、行锁、聚簇索引、崩溃恢复)
- 内存结构:Buffer Pool、Change Buffer、Log Buffer、Adaptive Hash Index
- 后台线程:Master、IO Read、IO Write、Purge
2. 索引(面试必考)
- 聚簇索引 vs 二级索引
- 数据结构:B+ 树(核心) vs Hash vs R-tree vs Full-text
- 索引组织表(IOT)
- 覆盖索引、最左前缀、索引下推(ICP)
- 索引失效的 10+ 种场景(最常考)
- 索引设计原则(区分度、前缀索引、联合索引顺序)
3. 事务
- ACID 四大特性
- 事务隔离级别:RU / RC / RR / Serializable
- MVCC 多版本并发控制(核心:ReadView + undo log)
- 间隙锁(Gap Lock)、临键锁(Next-Key Lock)
- 幻读、不可重复读、脏读的根因分析
4. 锁
- 全局锁、表锁、元数据锁(MDL)
- 行锁(Record Lock / Gap Lock / Next-Key Lock)
- 意向锁、插入意向锁、自增锁
5. 日志
- binlog(归档层,逻辑日志,Server 层)
- redo log(持久性,物理日志,InnoDB 层)
- undo log(回滚 + MVCC)
- 两阶段提交(XA)保证 binlog 与 redo log 一致性
- WAL(Write Ahead Log)思想
6. SQL 优化
EXPLAIN字段详解(type、key、rows、Extra)- 慢查询日志 +
show profile - 深分页优化、子查询优化、JOIN 优化
OPTIMIZER_TRACE分析优化器决策
7. 主从与高可用
- 主从复制原理(binlog dump → relay log → 重放)
- GTID 主从、并行复制
- MHA / MGR / InnoDB Cluster 高可用方案
B. Redis(重点)
1. 数据结构
- string / list / hash / set / zset / stream / bitmap / HyperLogLog / GEO
- 底层:SDS / quicklist / skiplist / dict / ziplist / intset / listpack
- 渐进式 rehash
2. 持久化
- RDB(快照,fork + COW)
- AOF(命令追加,3 种写回策略,重写机制)
- 混合持久化(RDB+AOF)
- Redis 6.0 multi-part AOF
3. 高可用与集群
- 主从复制(replicaof + 全量/增量同步)
- 哨兵 Sentinel(选举、Raft 简版)
- Cluster(16384 槽位、一致性 hash、slot 迁移、Gossip 协议)
- Codis(客户端分片,对比 Cluster)
4. 缓存设计(高频场景题)
- 缓存三大问题:穿透 / 雪崩 / 击穿 解决方案
- 数据一致性(Cache Aside、Read/Write Through、Write Behind)
- 布隆过滤器、分布式锁、内存淘汰策略(8 种)
- 大 Key、热 Key 发现与治理
5. Redis 新特性
- Redis 6 多线程 IO(注意:只是 IO 不是命令执行)
- Redis 7 Function、Client Side Cache
- Redis vs Memcached vs Caffeine 对比
- Redis 替代品:KeyDB / Dragonfly / Redict
二、任务清单(可勾选打卡)
Week 11 · MySQL 架构与索引
- 启动 MySQL 容器,跑通连接并用
SHOW ENGINE INNODB STATUS - 精读 InnoDB Buffer Pool 工作机制
- 阅读《高性能 MySQL》第 5 章(索引)并画 B+ 树结构图
- 写 demo:EXPLAIN 不同 SQL,对比 type 字段
- 总结 10+ 种索引失效场景
Week 12 · MySQL 事务与锁
- 用 SQL 演示 4 种隔离级别的区别
- 阅读 MVCC 原理:ReadView + undo log,画流程图
- 写 demo:手动造一个死锁场景,用
SHOW ENGINE INNODB STATUS分析 - 阅读《MySQL 是怎样运行的》第 19 章
Week 13 · MySQL 日志与主从
- 演示 redo log 两阶段提交(用 binlog + redo log 双写)
- 在本地用 docker-compose 搭建 1 主 2 从
- 演示 GTID 主从切换
- 写一份主从延迟排查笔记
Week 14 · MySQL 优化与 Redis 基础
- 10 条慢 SQL 优化实战(含深分页、COUNT 优化)
- 用
pt-query-digest分析慢查询日志 - 启动 Redis 容器,跑通 5 种基本数据结构
- 阅读 redis 源码:
dict.c/t_string.c/ziplist.c
Week 15 · Redis 持久化与集群
- 对比 RDB、AOF、混合持久化,恢复速度与数据丢失
- 搭建 Redis Cluster(6 节点:3 主 3 从)
- 演示 slot 迁移过程
- 用 Sentinel 实现自动故障转移
Week 16 · 缓存设计与一致性
- 写 demo:缓存穿透 / 雪崩 / 击穿 各一种解法
- 实现 Cache Aside Pattern,能讲清流程
- 用 Redisson 实现分布式锁,并对比 SETNX+Lua 写法
- 输出《MySQL+Redis 综合设计方案》md 笔记
三、阶段验收标准
✅ 能独立完成: - 现场画 InnoDB Buffer Pool 与 redo log 协作流程 - 画 MVCC 的 ReadView 在 RC / RR 下的差异 - 给一段慢 SQL,能用 EXPLAIN 分析并提出索引优化方案 - 讲解 Redis Cluster 的 Gossip 协议与 slot 迁移 - 解决"数据库与缓存不一致"3 种方案的选择
四、产出物
notes/P3-week11-索引B+树.mdnotes/P3-week12-事务与MVCC.mdnotes/P3-week13-日志与主从.mdnotes/P3-week14-SQL优化.mdnotes/P3-week15-Redis持久化与集群.mdnotes/P3-week16-缓存设计.mddocker/mysql-cluster/一键启动脚本docker/redis-cluster/一键启动脚本report/MySQL+Redis综合设计方案.md
五、面试高频问题预告
- 为什么用 B+ 树而不是 B 树 / 红黑树?
- RR 怎么避免幻读?什么情况下还是会幻读?
- binlog 与 redo log 区别?为什么需要两阶段提交?
- Redis 单线程为什么那么快?
- 缓存与数据库一致性怎么保证?
- Redis Cluster 怎么扩容?迁移过程中请求怎么处理?