MySQL 补充题库(按公开题目方向整理)
这份文档是按公开可见的 MySQL 面试题方向重新整理的补充版,重点不是照抄题目,而是把这些常见问法转成更适合你面试时输出的回答。
如果你前面已经看过本站的:
03_MySQL八股题库03_MySQL原理大纲
那这份更像是“补充问法 + 面试回答模板”。
一、MySQL 排序底层是怎么做的
推荐回答
MySQL 排序不一定都靠索引。 如果 order by 能命中合适索引,数据库可以直接按索引有序读取; 如果命不中,就可能走 filesort,也就是额外做排序。
你可以补的点
- 命中索引排序通常更省
- 不命中索引时可能出现
Using filesort - 排序前如果结果集太大,成本会明显上升
面试更稳的说法
我会先看 order by 能不能和 where 一起命中联合索引。如果 explain 里出现 Using filesort,我就会继续怀疑排序字段和过滤字段的索引设计是否不匹配。
二、一条 SQL 在 MySQL 里大概是怎么执行的
推荐回答
一条 SQL 大致会经历:
- 连接器接收请求
- 解析 SQL
- 优化器选择执行计划
- 执行器调用存储引擎
- 存储引擎根据索引或数据页取数
- 返回结果
面试更稳的说法
我理解 SQL 执行不只是“跑一下语句”,而是连接、解析、优化、执行、存储引擎取数这几层一起完成。慢 SQL 排查时,我也会优先判断是执行计划问题、锁等待问题,还是底层 IO 和页访问问题。
三、MySQL 常见索引类型有哪些
推荐回答
常见可以从两个维度讲:
1. 从存储结构讲
- B+ 树索引
- 哈希索引
2. 从业务语义讲
- 主键索引
- 唯一索引
- 普通索引
- 联合索引
- 全文索引
面试更稳的说法
真实项目里最常用的还是 InnoDB 下的 B+ 树索引,重点不是背名字,而是知道主键索引、联合索引、覆盖索引、回表这些是怎么串起来影响查询性能的。
四、Change Buffer 是什么,它解决什么问题
推荐回答
Change Buffer 是 InnoDB 用来优化二级索引写入的一种机制。 当修改的是非唯一二级索引页,而对应数据页又不在内存里时,可以先把变更缓存在 Change Buffer 里,后面再合并到真正的数据页。
它适合什么
- 写多读少
- 二级索引较多
- 非唯一索引更新
它不适合什么
- 唯一索引
- 读非常频繁、很快就会回查的场景
五、为什么批量入库通常比单条插入更快
推荐回答
因为批量入库能减少:
- 网络往返
- SQL 解析次数
- 事务提交次数
- 索引维护的分散成本
面试更稳的说法
批量插入快不只是因为“少发几次请求”,而是整个写入链路里的解析、事务、日志和索引维护成本都被摊薄了。
六、全量同步和增量同步怎么理解
推荐回答
- 全量同步:把完整数据整体同步一次
- 增量同步:只同步变化部分
优缺点
- 全量同步简单,但成本大
- 增量同步效率高,但要解决变更捕获、顺序、一致性和补偿
项目里怎么讲
像 MySQL 到 ES、报表库、搜索库这种同步,通常会先全量初始化,再走 binlog / MQ 的增量链路。
七、游标分页为什么通常比 LIMIT OFFSET 更稳
推荐回答
因为大 offset 分页会先扫描前面大量数据再丢掉,成本很高。 游标分页通常基于上次最大 id 或排序字段继续往后查,避免无意义扫描。
面试更稳的说法
如果是深分页,我一般不会继续让数据库吃大 offset,而会改成基于主键或稳定排序字段的游标分页。
八、MySQL 常见存储引擎及区别
推荐回答
最常讲的是:
- InnoDB
- MyISAM
重点区别
- InnoDB 支持事务、行锁、MVCC、崩溃恢复
- MyISAM 不支持事务,更偏老场景
面试更稳的说法
现代业务系统里默认都是 InnoDB,因为订单、支付、订阅、退款这类链路都需要事务和并发控制能力。
九、聚簇索引和非聚簇索引怎么理解
推荐回答
InnoDB 的主键索引是聚簇索引,叶子节点直接存整行数据。 二级索引叶子节点存的是索引列值和主键值。
这会带来什么
- 通过二级索引查非覆盖字段时,往往需要回表
- 主键设计会直接影响数据组织方式
十、什么是回表
推荐回答
通过二级索引先找到主键,再回到聚簇索引里取整行数据,这个过程就叫回表。
为什么它重要
因为回表通常意味着:
- 多一次索引访问
- 更高的 IO 成本
面试更稳的说法
高频查询里,如果能通过覆盖索引避免回表,通常能明显降低成本。
十一、最左前缀原则怎么理解
推荐回答
联合索引只有命中最左连续前缀时,才能更有效利用索引。
例如索引 (a, b, c):
aa, ba, b, c
这些通常都比较能利用索引; 直接查 b, c 就会差很多。
面试更稳的说法
最左前缀本质上不是死记规则,而是联合索引本身有自己的有序组织方式。
十二、什么是覆盖索引
推荐回答
如果查询需要的字段全部都在索引里,就不需要回表,这就是覆盖索引。
为什么它快
- 少一次回表
- IO 更少
- 高频查询收益很明显
十三、什么是索引下推 ICP
推荐回答
索引下推是指在索引扫描阶段,就提前用部分条件过滤数据,减少回表次数。
面试更稳的说法
它的价值不在“名字高级”,而在于把本来要回表后再判断的条件,尽量前移到索引层过滤。
十四、建索引时要注意什么
推荐回答
重点看:
- 查询条件
- 排序字段
- 选择性
- 覆盖索引机会
- 写入成本
不要只会说“建索引就行”
因为索引会带来:
- 写放大
- 空间占用
- 维护成本
面试更稳的说法
建索引不是越多越好,而是要让 where、order by、group by 和高频查询路径尽量对齐。
十五、索引建了为什么不一定有效,怎么排查
推荐回答
常见原因:
- 联合索引没命中最左前缀
- 字段用了函数
- 发生隐式类型转换
- like 以
%开头 - 优化器判断全表扫更便宜
排查方式
- 跑 explain
- 看
key - 看
type - 看
rows - 看
Extra
十六、索引是不是越多越好
推荐回答
不是。 索引越多:
- 写入越慢
- 更新越贵
- 占空间越大
- 优化器选择也可能更复杂
面试更稳的说法
索引的目标是支撑高价值查询,不是把每个字段都索引化。
十七、B+ 树里一条查询是怎么走的
推荐回答
一条查询大致会:
- 从根节点开始
- 根据 key 范围往下走到子节点
- 一层层定位到叶子节点
- 在叶子节点找到目标记录或范围
为什么快
- 多叉树高度低
- 磁盘 IO 次数少
- 范围查询天然适配
十八、为什么 MySQL 索引一般选 B+ 树
推荐回答
因为 B+ 树:
- 高度低
- 更适合磁盘页
- 范围查询好
- 排序能力强
为什么不是哈希
哈希更适合等值查找,不适合范围查询和排序。
十九、binlog、redo log、undo log 分别是什么
推荐回答
undo log:回滚和 MVCCredo log:崩溃恢复和持久性binlog:server 层逻辑日志,主从复制和恢复
面试更稳的说法
我理解这三种日志不是背定义,而是知道事务、恢复、复制这三件事分别依赖哪一层日志。
二十、MySQL 是怎么实现事务的
推荐回答
事务最终是靠几类能力一起实现的:
undo log保证回滚redo log保证持久化- 锁和 MVCC 保证隔离性
- 约束和业务规则共同保证一致性
面试更稳的说法
我理解事务不是单靠某一个日志就能完成,而是回滚、持久化、并发控制和业务约束共同作用的结果。
三、怎么用这份补充题库
建议你这样刷:
- 先把“索引链”讲顺
- B+ 树
- 聚簇索引
- 回表
- 覆盖索引
- 最左前缀
- 索引下推
- 再把“执行链”讲顺
- SQL 执行过程
- explain
- 排序
- 慢 SQL
- 最后把“事务链”讲顺
- ACID
- undo / redo / binlog
- MVCC
- 锁
只要这三条链能讲顺,MySQL 面试基本就不会显得散。