MySQL 20% 核心知识
目标:只掌握最重要的 20% 知识,应对 80% 的开发、排查、面试场景。
1. 先记住一句话
MySQL 最常见的问题,本质上大多都绕不开这 5 件事:
- 索引有没有建对
- SQL 有没有写对
- 事务有没有开太大
- 锁是不是冲突了
- 执行计划是不是变差了
如果你能把这 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):
aa, ba, b, c
这几种最容易利用好索引。
但如果你直接查 b, c,大概率就很难充分利用。
2.7 索引什么时候容易失效
高频场景只有这几种:
- 对列使用函数
- 隐式类型转换
- 没遵守最左前缀
OR用得不合理LIKE '%xxx'- 优化器觉得全表扫更便宜
3. 最重要的 SQL 优化知识
3.1 先养成这几个习惯
- 不要乱写
SELECT * - 高频查询一定要看索引
- 分页要警惕深分页
JOIN字段要有索引- 慢 SQL 一定先看
EXPLAIN
3.2 深分页为什么慢
SELECT * FROM user ORDER BY id LIMIT 100000, 20;慢的原因:
- MySQL 先扫前 100000 条,再丢掉,再取后 20 条
优化思路:
- 用主键游标翻页
- 或先查主键,再回表
3.3 COUNT 怎么记
COUNT(*):统计总行数COUNT(column):统计该列非 NULL 数量
平时统计总行数,优先写 COUNT(*)
3.4 JOIN 怎么记
你不需要背很多理论,先记住两条:
- 关联字段要有索引
- 小结果集尽量驱动大结果集
4. 一定要会看 EXPLAIN
大多数 SQL 问题,最后都会落到 EXPLAIN。
4.1 最重要看哪几个字段
只盯这 5 个就够你应对大多数场景:
typekeykey_lenrowsExtra
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 思路
- 是不是全表扫
- 用了哪个索引
- 扫了多少行
- 有没有额外排序和临时表
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 事务最容易犯的错
- 事务开太大
- 事务里做 RPC
- 事务里做复杂逻辑
- 事务里查太多无关数据
记住一句话:
事务要短、小、快。
6. 锁与死锁,只要先掌握这些
6.1 为什么会锁冲突
因为多个事务同时修改同一批数据,大家互相等。
6.2 为什么会死锁
因为两个事务获取资源的顺序不一致,互相等待。
典型例子:
- 事务 A 先锁订单,再锁库存
- 事务 B 先锁库存,再锁订单
这就容易死锁。
6.3 如何降低死锁概率
- 访问资源顺序统一
- 通过索引精确命中数据
- 事务尽量短
- 批量操作拆小批次
6.4 排查锁问题先看什么
先看:
- 有没有大事务
- 有没有热点更新
- SQL 有没有走索引
SHOW ENGINE INNODB STATUS
7. 慢 SQL 排查,记住这个流程
7.1 标准流程
- 先找到慢 SQL
- 看
EXPLAIN - 看索引是否命中
- 看是不是扫描太多
- 看是不是锁等待
- 优化后再验证
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. 最小面试清单
如果你只准备最核心的面试题,先把这些答顺:
- 什么是索引,为什么能加速查询
- 为什么 InnoDB 用 B+ 树
- 什么是聚簇索引、二级索引、回表、覆盖索引
- 联合索引为什么要遵守最左前缀
EXPLAIN看哪些字段- 什么是事务,ACID 是什么
- MySQL 默认隔离级别是什么
- 什么是 MVCC
- 为什么会死锁,怎么避免
- 慢 SQL 怎么排查
12. 学习建议
如果你只学 20%,建议按这个顺序:
- 先学索引:第 2 章
- 再学 SQL 优化:第 3 章
- 再学
EXPLAIN:第 4 章 - 再学事务和锁:第 5、6 章
- 最后看 Java 坑和线上问题:第 9、10 章
只要你把这 12 章吃透,再回头看完整版 MySQL 笔记,会轻松很多。
13. 一句话总复习
- 索引:决定你查得快不快
- SQL:决定你会不会把数据库写废
- 事务:决定并发时数据对不对
- 锁:决定系统会不会互相卡死
EXPLAIN:决定你能不能定位 SQL 问题