参考:高性能 MySQL(第 4 版) · MySQL 技术内幕:InnoDB 存储引擎(第 2 版) · MySQL 8.4 Reference Manual。每章含可暂停 Lab 动画 + 面试问答 + 书籍章节对照。
MySQL 面试 · Lab E · 工程场景与排障
工程场景与排障
主问题
-- 线上某接口 p99 突然飙高,疑似慢查询你怎么一步步定位、优化、验证、回滚?
这题真正考什么
- · 不是考你会不会说「加个索引」。
- · 而是考你有没有从定位到验证回滚的完整排查闭环。
学完你要能做到
- · 按证据链分层排查慢查询,而不是猜
- · 说清缓存一致性的失败窗口和补偿
- · 给出死锁的根因治理 + 幂等重试
- · 设计可灰度、可回滚的索引上线方案
按闭环来:先从慢日志 / APM 定位具体 SQL,再EXPLAIN 读访问路径。
给出加索引 / 改 SQL 方案并评估写放大,然后小流量验证p95 和扫描行数。
最后可回滚地上线 —— 不会一上来就盲目加索引。
学习路线
点节点跳转 · 滚动时自动高亮当前位置
这道题到底在问什么?
表面问「怎么排查慢接口」,实际是在考你有没有从定位到验证回滚的完整闭环, 而不是只会说「加个索引」。
差的回答
「慢就加个索引嘛。」
想听到的
定位 → 读计划 → 改造 → 验证 → 回滚。
先定位,再动手
「接口慢」不等于「SQL 慢」,先分清慢在哪一层。
DB 层
SQL / 索引 / 锁
慢日志 + EXPLAIN + 锁等待,定位访问路径、回表和锁竞争。
应用 / 网络
不一定在 DB
连接池耗尽、序列化、GC、跨服务调用,也会让接口 p99 飙高。
资源瓶颈
CPU / IO / 内存
Buffer Pool 命中、脏页刷盘、磁盘 IO 也要一起看,别只盯 SQL。
排查闭环怎么走(Lab)
逐步走一遍五段式闭环,每一步都绑定「怎么说 / 常见误区」。
当前发生了什么
从接口 p99 / 慢日志 / APM 找到具体 SQL 和时间窗口,分清慢在 DB 还是应用 / 网络 / 锁等待。
为什么会这样
不先定位就优化,很容易优化错对象。
面试怎么回答
我会先拿证据:慢日志、EXPLAIN、锁等待、资源曲线,而不是直接加索引。
常见误区
误区:一上来就加索引,把锁等待 / 连接池耗尽都当成 SQL 慢。
缓存和数据库怎么保持一致?
面试常考的 cache aside,关键是承认「短暂不一致」并补偿。
读路径Cache Aside- 1先读缓存
- 2命中直接返回
- 3未命中查 DB 再回填
写路径先更 DB 再删缓存- 1更新数据库
- 2删除缓存(不是改缓存)
- 3失败靠重试 / 消息 / CDC 补偿
死锁后应用怎么处理?
死锁不是要完全避免,而是降低概率 + 安全重试 + 根因治理。
降低概率
短事务 + 固定顺序
缩短持锁时间,多表访问固定加锁顺序,避免形成等待环。
缩小锁范围
用合适索引
精确索引避免大范围锁定,减少锁冲突面,从根因降低死锁。
幂等重试
捕获后有限重试
捕获 deadlock / lock wait timeout,对幂等操作做带上限的退避重试。
工程取舍对比
四个高频场景,把「常见错误归因」换成「正确做法」。
| 问题 | 常见错误归因 | 正确做法 |
|---|---|---|
| 接口慢 | 都怪 SQL,盲目加索引 | 先分层定位,再对症优化 |
| 缓存一致 | 以为缓存能强一致 | cache aside + 补偿,承认短暂不一致 |
| 死锁 | 当成数据库 bug 不处理 | 降低概率 + 幂等重试 + 根因治理 |
| 深分页 | 直接大 offset 扫描 | seek pagination / 业务游标 |
面试回答生成器
按时间预算选一档念出来。
我会按闭环来:先从慢日志 / APM 定位具体 SQL,再 EXPLAIN 读访问路径,给出加索引 / 改 SQL 的方案并评估写放大,然后小流量同口径验证 p95 和扫描行数,最后可回滚地上线。
不会一上来就盲目加索引。
追问链 + 复习清单
勾掉每一条,这道题就算通关。
通关检查
0/5 已掌握追问链
- Q如何设计可回滚的索引上线方案?
- Q热点库存扣减如何降低锁冲突?
- Qbinlog / CDC 延迟时缓存如何兜底?