Skip to content

MySQL 速查卡

🎯 覆盖 29 题 | ⭐ 高频 14 题 | 预计扫描 10 分钟 📌 先看⭐一句话答案 → 展开要点 → 自测清单检验


一、索引

知识地图:B+树(非叶只存key,叶子存数据+双向链表) → 聚簇(主键=数据) / 二级(叶子存主键→回表)

⭐ InnoDB 索引 = B+ 树

一句话: InnoDB 用 B+ 树作为索引结构,非叶子节点只存 key(路由),叶子节点存数据且用双向链表相连,三层可存约 2200 万条记录。

B+ 树 vs B 树: B 树非叶子也存数据 → 每页存的 key 少 → 树更高 → IO 多;B+ 叶子链表支持高效范围查询

关键数字: 页 16KB,bigint 8B + 指针 6B → 每页 ~1170 个 key → 三层 1170 × 1170 × 16 ≈ 2200 万行(只需 3 次 IO)


⭐ 聚簇索引 / 二级索引 / 回表

一句话: 聚簇索引叶子存完整行数据(主键索引=聚簇),二级索引叶子存主键值 → 查完整数据需回表(用主键去聚簇索引二次查找)。

二级索引查询 SELECT * WHERE name='Alice':
  name 索引找到 → 得到主键 id=100 → 用 id=100 去聚簇索引查完整行(回表)
  
覆盖索引避免回表:SELECT name,age WHERE name='Alice' + 联合索引(name,age) → 索引中已有全部查询列

⭐ 联合索引 + 最左前缀

一句话: 联合索引 (a,b,c) 按 a→b→c 排序,查询必须从最左列开始匹配;范围查询后面的列失效。

索引 (a,b,c):
  WHERE a=1 AND b=2 AND c=3  ✅ 全用
  WHERE a=1 AND c=3           ✅ 只用到 a(跳过了 b)
  WHERE b=2                   ❌ 跳过了 a
  WHERE a=1 AND b>2 AND c=3  ✅ a,b 用到,c 失效(b 是范围)

⚠️ 易错:MySQL 优化器会自动调整 WHERE 子句字段顺序,WHERE b=2 AND a=1 等效于 WHERE a=1 AND b=2


⭐ 索引失效 7 大场景

① 索引列用函数: WHERE YEAR(time)=2024 → 改为范围查询
② 隐式类型转换: WHERE varchar_col=100 → 加引号 '100'
③ LIKE '%xx': 后缀/中缀通配符 → 前缀 'xx%' 才走索引
④ 联合索引跳过最左列
⑤ OR 有一侧无索引 → 全表扫描
⑥ 索引列参与计算: WHERE age+1=19 → 改为 age=18
⑦ 数据量太小,优化器选全表扫描更快

二、事务与 MVCC

知识地图:ACID(原一隔持) → 隔离级别(RU/RC/RR/S) → MVCC(隐藏列+undo log版本链+ReadView)

⭐ ACID

一句话: A 原子性(undo log 回滚) + C 一致性(AID 保证) + I 隔离性(锁+MVCC) + D 持久性(redo log + WAL)。

⭐ 事务隔离级别

级别脏读不可重复读幻读
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ(默认)⚠️基本解决
SERIALIZABLE

⚠️ 易错:InnoDB 的 RR 通过 MVCC + Next-Key Lock 解决了大多数幻读,比标准 SQL 定义更强


⭐ MVCC 原理

一句话: MVCC 通过隐藏列(DB_TRX_ID/DB_ROLL_PTR) + undo log 版本链 + ReadView 实现无锁快照读;RC 每次读生成新 ReadView,RR 整个事务只生成一次。

ReadView 四字段: creator_trx_id / trx_ids(活跃事务集) / min_trx_id / max_trx_id

可见性判断:

版本的 trx_id:
  == creator → 自己改的,可见
  < min → 已提交,可见
  >= max → 后来的事务,不可见
  在[min,max)之间 → 在 trx_ids 中=未提交不可见;不在=已提交可见
  不可见 → 沿版本链找上一版本

RC vs RR 的区别就在于 ReadView 生成时机:

  • RC:每次 SELECT 生成新 ReadView → 能看到其他事务已提交的新数据
  • RR:第一次 SELECT 生成后复用 → 看到的始终是同一快照

三、锁与日志

⭐ MySQL 锁体系

一句话: InnoDB 行锁有三种——Record Lock(锁单行) + Gap Lock(锁间隙防插入) + Next-Key Lock(前开后闭,RR默认,防幻读)。

数据 id = 1, 5, 10, 15 时 Next-Key Lock 区间:
  (-∞,1] (1,5] (5,10] (10,15] (15,+∞)

当前读 vs 快照读: 普通 SELECT = 快照读(MVCC,无锁);SELECT FOR UPDATE / INSERT / UPDATE / DELETE = 当前读(加锁)


⭐ redo log / undo log / binlog

日志层级作用写入时机
redo logInnoDB 引擎崩溃恢复(持久性)事务执行中
undo logInnoDB 引擎回滚(原子性) + MVCC 版本链事务执行中
binlogServer 层主从复制 + 数据恢复事务提交时

两阶段提交: redo log prepare → binlog fsync → redo log commit;崩溃恢复:prepare+有binlog→补commit;prepare+无binlog→回滚


四、性能优化

⭐ EXPLAIN 关键字段

type 性能排名: system > const > eq_ref > ref > range > index > ALL

Extra 关注: Using index(覆盖索引,好) / Using filesort(需优化) / Using temporary(需优化) / Using index condition(ICP)

⭐ SQL 优化思路

① 加合适索引(联合索引覆盖高频查询)
② 避免 SELECT *,按需查字段(利用覆盖索引)
③ 深分页优化:游标分页(WHERE id > last_id) 或延迟关联(先查主键再JOIN)
④ 避免索引失效(函数/隐式转换/LIKE%开头)
⑤ 小表驱动大表,被驱动表 JOIN 字段有索引
⑥ 批量操作代替逐行

五、分库分表

⭐ 分表策略

一句话: 单表超 500万-2000万行考虑分表;哈希分表(均匀但扩容难)vs 范围分表(扩容易但可能热点)vs 预分表(1024张表,扩容只迁物理机)。

Sharding Key 选择: 高频查询字段 + 高基数 + 不可变 + 相关数据同分片(减少跨分片 JOIN)

分布式事务: TCC(Try-Confirm-Cancel) / Seata AT(无侵入) / 本地消息表+MQ(最终一致)


六、MySQL 8.0

⭐ 窗口函数 vs GROUP BY

一句话: GROUP BY 多行变一行(丢失明细),窗口函数行数不变(聚合值附加在每行上);窗口函数通常比等效自连接更高效。

常用:ROW_NUMBER() / RANK() / DENSE_RANK() / LAG() / LEAD() / SUM() OVER()


补充速览

关键词核心答案
B+树增删插入:节点满→分裂上推; 删除:节点不足→借兄弟/合并
覆盖索引查询列都在索引中,不需要回表;EXPLAIN Extra=Using index
何时建索引WHERE/JOIN/ORDER BY 高频列 + 高选择性;不建:数据少/更新频繁/低选择性
哈希索引O(1)等值查询但不支持范围排序;InnoDB 的 AHI 是自动的
SQL 执行全过程连接器→(查询缓存8.0已移除)→解析器→优化器→执行器→存储引擎→返回
千亿数据存储热(MySQL分库分表)→温(TiDB)→冷(Hive/ClickHouse) + 读写分离 + 多级缓存
CTEWITH RECURSIVE 递归查询,适合树形结构(组织架构)
JSON 支持config->>'$.host' 提取; generated column + 索引

🧠 助记汇总

口诀含义
原一隔持ACID: 原子性/一致性/隔离性/持久性
脏不幻三大并发问题:脏读/不可重复读/幻读
记隙临三种行锁:Record Lock/Gap Lock/Next-Key Lock
redo持久,undo原子,bin复制三种日志各自作用
const>eq_ref>ref>range>index>ALLEXPLAIN type 性能排名
函转模跳或算少索引失效七场景首字

✅ 自测清单

#问题你能说出...
1B+树核心特点 + 为什么选 B+ 不选 B + 2200 万计算
2聚簇/二级/回表各自定义 + 如何避免回表(覆盖索引)
3联合索引最左前缀 + 范围查询后列失效
4索引失效至少说出 5 种场景
5ACID各自实现机制
6MVCC三大组件 + ReadView 可见性判断 + RC vs RR 区别
7隔离级别四级 + 各解决什么问题
8三种日志redo/undo/binlog 各自作用 + 两阶段提交
9MySQL 锁三种行锁 + 当前读 vs 快照读
10EXPLAINtype 排名 + Extra 关键值
11SQL 优化六大思路
12分库分表策略 + Sharding Key 选择 + 分布式事务
13窗口函数vs GROUP BY 核心区别

💡 首次全部过一遍 → 第2天只过答不上来的 → 第4天再复习 → 面试前一天最后扫一遍