MySQL 面试题
目录概述
MySQL 面试的核心不在于背几个概念,而在于能否从索引、锁、事务、性能优化四个维度形成闭环认知。
这个目录帮你从"会写 SQL"进阶到"理解 MySQL 底层是怎么工作的",站在面试官视角拆解每一个知识点的追问逻辑。
【面试官心理】 我出 MySQL 题,通常从索引开始:"Explain 里的 key_len 怎么计算的?" 能答对的占 30%,能说出联合索引结构的占 20%,能讲清楚最左前缀原理的只有 10%。索引这个话题可以追问到非常深,是筛选候选人的利器。
内容范围
核心主题
索引与数据结构:
- B+ 树索引:为什么不用二叉树、红黑树、B 树
- 聚簇索引与辅助索引:数据存储方式、查询效率差异
- 最左前缀原则:联合索引结构、索引失效场景
- 覆盖索引:减少回表、索引下推
- 索引条件下推 ICP:减少回表次数
- 索引失效场景:函数、隐式转换、LIKE 前导通配符
- 索引合并:index merge、intersection、union、sort union
事务与隔离级别:
- ACID 特性:原子性、隔离性、一致性、持久性
- 四种隔离级别:Read Uncommitted、Read Committed、Repeatable Read、Serializable
- 隔离级别实现:MVCC、锁
- 脏读、不可重复读、幻读:概念与解决方案
- MVCC 原理:Read View、版本链、undo log
- Next-Key Lock:记录锁、间隙锁、临键锁
SQL 优化:
- EXPLAIN 分析:type、key、rows、Extra 字段解读
- 慢查询优化:索引优化、SQL 重写
- 分页优化:延迟关联、子查询优化
- JOIN 优化:嵌套循环、哈希连接、索引利用
- 排序优化:filesort、索引排序
锁机制:
- 共享锁与排他锁:SELECT ... LOCK IN SHARE MODE、SELECT ... FOR UPDATE
- 意向锁:表锁兼容、IX、IS
- 行锁与表锁:InnoDB vs MyISAM
- 死锁:产生条件、排查方法、避免策略
- 乐观锁与悲观锁:version 字段、CAS 思想
存储引擎:
- InnoDB vs MyISAM:事务支持、锁粒度、崩溃恢复、count(*) 性能
- InnoDB 架构:缓冲池、日志文件、doublewrite
面试题分级
高频必考题 🔴
B+ 树索引原理
面试官问:"为什么 MySQL 用 B+ 树而不是二叉树?"
能说出"数据量大时树太高、IO 次数多"的占 60%,能说出"范围查询效率高"的占 40%,能对比 B 树和 B+ 树区别的占 20%,能说清楚磁盘预读原理和局部性理论的只有 10%。
【面试官心理】 我问他为什么不用二叉树,其实想探查的是:他有没有从计算机原理层面理解索引。磁盘读写以页为单位、B+ 树叶子节点形成双向链表、范围查询只需遍历叶子节点——这些才是 B+ 树设计的精髓。
事务隔离级别
面试官问:"MySQL 的默认隔离级别是什么?Repeatable Read 能解决幻读吗?"
能说出"默认是 RR"的占 80%,能说出"RR 加锁解决幻读"的占 50%,能说出"RR 下快照读不加锁、当前读加锁"的占 20%,能说清楚 Next-Key Lock 怎么解决幻读的只有 10%。
MVCC 原理
面试官问:"MVCC 是什么?它是怎么实现的?"
能说出"多版本并发控制"的占 70%,能说出"Read View"的占 40%,能说清楚 Read View 包含哪些字段的占 20%,能说清楚版本链和 undo log 关系的只有 10%。
SQL 优化
面试官问:"有一张表数据量很大,查询很慢,怎么优化?"
能说出"加索引"的占 80%,能说出"分析执行计划"的占 60%,能说出具体索引设计思路的占 30%,能说出分库分表、读写分离方案的只有 10%。
中频常考题 🟡
- 联合索引结构
- index join 原理
- count(*) 效率
- InnoDB 行格式
- 主从复制原理
低频了解题 🟢
- Change Buffer
- 自适应哈希索引
- 刷新邻接页
- 分布式 MySQL
学习路径指引
P5 候选人(校招/初级社招)
先掌握索引基本概念、事务隔离级别、基础 SQL 优化。能用 EXPLAIN 分析简单 SQL,理解索引失效场景。这个阶段不需要深入原理。
P6 候选人(中级社招)
必须理解 B+ 树索引结构、MVCC 原理、锁机制。要能说出不同隔离级别下 MVCC 和锁的表现。SQL 优化要有实战经验,能针对慢查询给出优化方案。
P7 候选人(高级/架构方向)
除了原理,必须有表结构设计经验、索引设计经验、分库分表经验。能针对业务场景给出合理的存储方案。能讲清楚生产环境遇到的具体问题和排查过程。
【面试官心理】 P7 候选人聊 MySQL,我通常会问:"你们表结构设计有什么讲究?为什么这么设计索引?" 能讲清楚设计权衡的候选人,说明他真正做过大型项目。而只会说"我们用的 MySQL"的,说明缺乏深度。
生产避坑
慢查询
常见原因:索引缺失、索引失效、函数操作、隐式类型转换。排查方法:EXPLAIN、慢查询日志、Processlist。解决方案:加索引、改写 SQL、拆分数据。
死锁
InnoDB 行锁基于索引实现,锁住的是索引记录而非数据行。常见死锁场景:事务顺序不一致、gap lock 冲突。排查:show engine innodb status、事务日志。
数据不一致
主从延迟、读写分离场景下的数据一致性问题。解决方案:读从库前加注释、强制走主库、根据业务容忍度选择最终一致性。