Skip to content

MySQL 20% 核心知识

目标:只掌握最重要的 20% 知识,应对 80% 的开发、排查、面试场景。


1. 先记住一句话

MySQL 最常见的问题,本质上大多都绕不开这 5 件事:

  1. 索引有没有建对
  2. SQL 有没有写对
  3. 事务有没有开太大
  4. 锁是不是冲突了
  5. 执行计划是不是变差了

如果你能把这 5 件事搞明白,已经能解决绝大多数问题。


2. 最重要的索引知识

2.1 索引是什么

索引本质上是帮助 MySQL 快速查找数据的有序数据结构

在 InnoDB 里,最核心的是 B+ 树

2.2 为什么 InnoDB 用 B+ 树

因为它特别适合数据库场景:

  • 树高度低,磁盘 I/O 少
  • 范围查询强
  • 顺序访问友好

2.3 聚簇索引和二级索引

这是最关键的概念之一。

聚簇索引

  • 主键索引通常就是聚簇索引
  • 叶子节点直接存整行数据

二级索引

  • 叶子节点存的是:索引列 + 主键值
  • 查完二级索引,常常还得回主键索引再查一次整行

2.4 什么是回表

先查二级索引,拿到主键,再去聚簇索引查整行数据,这就叫回表

2.5 什么是覆盖索引

查询需要的字段,索引里刚好都有,不用回表,这就叫覆盖索引

结论

  • 能覆盖索引,就尽量覆盖索引
  • 这是高频 SQL 优化里最常见的思路之一

2.6 联合索引最重要的规则

记住这句就够了:

联合索引要遵循最左前缀原则。

例如索引 (a, b, c)

  • a
  • a, b
  • a, b, c

这几种最容易利用好索引。

但如果你直接查 b, c,大概率就很难充分利用。

2.7 索引什么时候容易失效

高频场景只有这几种:

  • 对列使用函数
  • 隐式类型转换
  • 没遵守最左前缀
  • OR 用得不合理
  • LIKE '%xxx'
  • 优化器觉得全表扫更便宜

3. 最重要的 SQL 优化知识

3.1 先养成这几个习惯

  1. 不要乱写 SELECT *
  2. 高频查询一定要看索引
  3. 分页要警惕深分页
  4. JOIN 字段要有索引
  5. 慢 SQL 一定先看 EXPLAIN

3.2 深分页为什么慢

sql
SELECT * FROM user ORDER BY id LIMIT 100000, 20;

慢的原因:

  • MySQL 先扫前 100000 条,再丢掉,再取后 20 条

优化思路:

  • 用主键游标翻页
  • 或先查主键,再回表

3.3 COUNT 怎么记

  • COUNT(*):统计总行数
  • COUNT(column):统计该列非 NULL 数量

平时统计总行数,优先写 COUNT(*)

3.4 JOIN 怎么记

你不需要背很多理论,先记住两条:

  1. 关联字段要有索引
  2. 小结果集尽量驱动大结果集

4. 一定要会看 EXPLAIN

大多数 SQL 问题,最后都会落到 EXPLAIN

4.1 最重要看哪几个字段

只盯这 5 个就够你应对大多数场景:

  • type
  • key
  • key_len
  • rows
  • Extra

4.2 怎么快速判断

type

优先级大致这样记:

  • 好:const / ref / range
  • 差:index
  • 很差:ALL

只要看到 ALL,先警觉是不是全表扫描。

key

  • 实际用了哪个索引
  • 如果是 NULL,说明索引没用上

rows

  • 预估扫描多少行
  • 越大越危险

Extra

重点认识这几个:

  • Using index:覆盖索引,好
  • Using filesort:额外排序,警惕
  • Using temporary:临时表,警惕
  • Using index condition:索引下推

4.3 一套最简单的 EXPLAIN 思路

  1. 是不是全表扫
  2. 用了哪个索引
  3. 扫了多少行
  4. 有没有额外排序和临时表

5. 事务最重要的知识

5.1 ACID 不用背太细,只要懂意思

  • A 原子性:要么都成功,要么都失败
  • C 一致性:事务前后,数据处于正确状态
  • I 隔离性:并发事务之间互不干扰
  • D 持久性:提交后数据不会轻易丢

5.2 最重要的隔离级别结论

MySQL InnoDB 默认隔离级别是:

  • 可重复读(Repeatable Read, RR)

5.3 MVCC 只要这样理解就够了

MVCC 的核心作用:

  • 让读不阻塞写,写不阻塞读

它依赖:

  • Undo Log
  • Read View

你现阶段不需要死抠源码,只要知道它是 MySQL 并发性能高的重要原因。

5.4 事务最容易犯的错

  1. 事务开太大
  2. 事务里做 RPC
  3. 事务里做复杂逻辑
  4. 事务里查太多无关数据

记住一句话

事务要短、小、快。


6. 锁与死锁,只要先掌握这些

6.1 为什么会锁冲突

因为多个事务同时修改同一批数据,大家互相等。

6.2 为什么会死锁

因为两个事务获取资源的顺序不一致,互相等待。

典型例子:

  • 事务 A 先锁订单,再锁库存
  • 事务 B 先锁库存,再锁订单

这就容易死锁。

6.3 如何降低死锁概率

  1. 访问资源顺序统一
  2. 通过索引精确命中数据
  3. 事务尽量短
  4. 批量操作拆小批次

6.4 排查锁问题先看什么

先看:

  • 有没有大事务
  • 有没有热点更新
  • SQL 有没有走索引
  • SHOW ENGINE INNODB STATUS

7. 慢 SQL 排查,记住这个流程

7.1 标准流程

  1. 先找到慢 SQL
  2. EXPLAIN
  3. 看索引是否命中
  4. 看是不是扫描太多
  5. 看是不是锁等待
  6. 优化后再验证

7.2 慢 SQL 最常见原因

  • 没索引
  • 索引失效
  • 联合索引顺序不对
  • 深分页
  • 排序/分组走不了索引
  • 大事务、锁等待

8. 建表时最重要的原则

8.1 每张表都要有主键

而且主键最好:

  • 稳定
  • 尽量递增

8.2 字段类型先掌握这几个

  • 金额:DECIMAL
  • 时间:DATETIME
  • 状态:TINYINT
  • 主键/关联 ID:BIGINT
  • 字符串:大多数情况 VARCHAR

8.3 为什么不要滥建索引

索引不是越多越好。

索引多的代价:

  • 占空间
  • 写入变慢
  • 维护成本高

9. Java 开发最容易踩的 MySQL 坑

9.1 Spring 事务常见坑

  • 方法不是 public
  • 同类内部自调用导致事务失效
  • 异常被吞掉,事务没回滚
  • 事务边界太大

9.2 ORM 常见坑

  • SELECT *
  • N+1 查询
  • 批量更新不分批
  • 动态 SQL 没走索引

9.3 连接池常见坑

  • 最大连接数乱配
  • 获取连接超时没处理好
  • 连接泄漏
  • SQL 太慢导致连接长期占用

10. 线上最常见的 4 类问题

10.1 慢 SQL

先查慢查询日志,再看 EXPLAIN

10.2 锁等待 / 死锁

先查大事务、热点更新、索引命中情况

10.3 连接数打满

先看连接池,再看慢 SQL,再看阻塞

10.4 主从延迟

先看是否有大事务、DDL、从库压力


11. 最小面试清单

如果你只准备最核心的面试题,先把这些答顺:

  1. 什么是索引,为什么能加速查询
  2. 为什么 InnoDB 用 B+ 树
  3. 什么是聚簇索引、二级索引、回表、覆盖索引
  4. 联合索引为什么要遵守最左前缀
  5. EXPLAIN 看哪些字段
  6. 什么是事务,ACID 是什么
  7. MySQL 默认隔离级别是什么
  8. 什么是 MVCC
  9. 为什么会死锁,怎么避免
  10. 慢 SQL 怎么排查

12. 学习建议

如果你只学 20%,建议按这个顺序:

  1. 先学索引:第 2 章
  2. 再学 SQL 优化:第 3 章
  3. 再学 EXPLAIN:第 4 章
  4. 再学事务和锁:第 5、6 章
  5. 最后看 Java 坑和线上问题:第 9、10 章

只要你把这 12 章吃透,再回头看完整版 MySQL 笔记,会轻松很多。


13. 一句话总复习

  • 索引:决定你查得快不快
  • SQL:决定你会不会把数据库写废
  • 事务:决定并发时数据对不对
  • 锁:决定系统会不会互相卡死
  • EXPLAIN:决定你能不能定位 SQL 问题