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

面试题分级

级别考察重点期望回答判分标准
P5索引基本原理、事务概念、SQL 语法能背出基本概念,不怵简单追问表面正确
P6索引设计、事务隔离级别、SQL 优化能回答追问,理解底层原理深度过关
P7性能调优、架构设计、生产问题有实战案例,能做 trade-off经验闭环

高频必考题 🔴

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、事务日志。

数据不一致

主从延迟、读写分离场景下的数据一致性问题。解决方案:读从库前加注释、强制走主库、根据业务容忍度选择最终一致性。

导航指引