MySQL 知识很容易越记越散:今天看索引,明天看慢查询,后天又碰到 DDL、锁等待和连接池异常。比较稳的方式是先搭一个主题地图,把问题放到正确的位置。
我通常会把 MySQL 拆成六组。
索引和执行计划
第一组是索引和执行计划。这里要理解:
- B+ 树。
- 聚簇索引和二级索引。
- 最左匹配。
- 回表。
order by和索引顺序。EXPLAIN的访问类型、rows 和 extra。
遇到查询慢,先不要急着加索引,而是先看执行计划。索引有没有被用上、扫描行数大不大、是否出现 filesort,往往比猜测更可靠。
慢查询和 SQL 改写
第二组是慢查询优化。常见问题包括:
- 复杂 join。
- 深分页。
- 子查询改写。
- 大表范围查询。
- 条件选择性差。
- 统计类 SQL 过重。
深分页可以考虑延迟关联或游标分页;复杂查询要先确认业务是否真的需要一次查这么多字段。慢查询优化不是只看 SQL,还要看调用场景。
DDL 和字段变更
第三组是 DDL。比如加字段、改字段、建索引、字符集、大小写敏感和在线变更。
生产环境 DDL 要特别谨慎:
- 先确认表大小。
- 看是否会锁表。
- 评估主从延迟。
- 准备回滚方案。
- 必要时使用在线 DDL 工具。
很多事故不是 DDL 语法写错,而是低估了表大小和锁影响。
连接池和异常排障
第四组是连接相关问题:
- 连接池耗尽。
- 通信异常。
- 事务提交或回滚失败。
- 锁等待超时。
- 数据库连接超时。
这类问题要同时看应用日志、连接池指标和数据库状态。只看异常堆栈,往往只能看到结果,看不到根因。
锁、隔离级别和 MVCC
第五组是锁和事务隔离:
- 行锁、表锁、间隙锁。
- 当前读和快照读。
- 死锁。
- 隔离级别。
- LBCC 和 MVCC。
理解 MVCC 之后,再看可重复读、幻读和快照读,会清楚很多。排查死锁时,则要看事务顺序、索引条件和更新范围。
事务、分库分表和批量写入
第六组是更偏架构的主题:
- Spring 事务边界。
- 分库分表。
- 批量插入。
- SQL 片段沉淀。
- 订单或报表类读模型。
这部分不只是数据库知识,还会牵涉业务建模和系统架构。
维护建议
整理 MySQL 笔记时,不要把所有东西都堆到一个文档里。可以按“索引、慢查询、DDL、连接异常、锁事务、架构专题”拆开。每次遇到问题,先判断它属于哪一类,再补充到对应主题。
这样过一段时间后,MySQL 笔记会从资料堆变成可检索的排障地图。
正文完




