MySQL 补充题库(按公开题目方向整理)

这份文档是按公开可见的 MySQL 面试题方向重新整理的补充版,重点不是照抄题目,而是把这些常见问法转成更适合你面试时输出的回答。

如果你前面已经看过本站的:

  • 03_MySQL八股题库
  • 03_MySQL原理大纲

那这份更像是“补充问法 + 面试回答模板”。


一、MySQL 排序底层是怎么做的

推荐回答

MySQL 排序不一定都靠索引。 如果 order by 能命中合适索引,数据库可以直接按索引有序读取; 如果命不中,就可能走 filesort,也就是额外做排序。

你可以补的点

  • 命中索引排序通常更省
  • 不命中索引时可能出现 Using filesort
  • 排序前如果结果集太大,成本会明显上升

面试更稳的说法

我会先看 order by 能不能和 where 一起命中联合索引。如果 explain 里出现 Using filesort,我就会继续怀疑排序字段和过滤字段的索引设计是否不匹配。


二、一条 SQL 在 MySQL 里大概是怎么执行的

推荐回答

一条 SQL 大致会经历:

  1. 连接器接收请求
  2. 解析 SQL
  3. 优化器选择执行计划
  4. 执行器调用存储引擎
  5. 存储引擎根据索引或数据页取数
  6. 返回结果

面试更稳的说法

我理解 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)

  • a
  • a, b
  • a, b, c

这些通常都比较能利用索引; 直接查 b, c 就会差很多。

面试更稳的说法

最左前缀本质上不是死记规则,而是联合索引本身有自己的有序组织方式。


十二、什么是覆盖索引

推荐回答

如果查询需要的字段全部都在索引里,就不需要回表,这就是覆盖索引。

为什么它快

  • 少一次回表
  • IO 更少
  • 高频查询收益很明显

十三、什么是索引下推 ICP

推荐回答

索引下推是指在索引扫描阶段,就提前用部分条件过滤数据,减少回表次数。

面试更稳的说法

它的价值不在“名字高级”,而在于把本来要回表后再判断的条件,尽量前移到索引层过滤。


十四、建索引时要注意什么

推荐回答

重点看:

  • 查询条件
  • 排序字段
  • 选择性
  • 覆盖索引机会
  • 写入成本

不要只会说“建索引就行”

因为索引会带来:

  • 写放大
  • 空间占用
  • 维护成本

面试更稳的说法

建索引不是越多越好,而是要让 where、order by、group by 和高频查询路径尽量对齐。


十五、索引建了为什么不一定有效,怎么排查

推荐回答

常见原因:

  • 联合索引没命中最左前缀
  • 字段用了函数
  • 发生隐式类型转换
  • like 以 % 开头
  • 优化器判断全表扫更便宜

排查方式

  • 跑 explain
  • key
  • type
  • rows
  • Extra

十六、索引是不是越多越好

推荐回答

不是。 索引越多:

  • 写入越慢
  • 更新越贵
  • 占空间越大
  • 优化器选择也可能更复杂

面试更稳的说法

索引的目标是支撑高价值查询,不是把每个字段都索引化。


十七、B+ 树里一条查询是怎么走的

推荐回答

一条查询大致会:

  1. 从根节点开始
  2. 根据 key 范围往下走到子节点
  3. 一层层定位到叶子节点
  4. 在叶子节点找到目标记录或范围

为什么快

  • 多叉树高度低
  • 磁盘 IO 次数少
  • 范围查询天然适配

十八、为什么 MySQL 索引一般选 B+ 树

推荐回答

因为 B+ 树:

  • 高度低
  • 更适合磁盘页
  • 范围查询好
  • 排序能力强

为什么不是哈希

哈希更适合等值查找,不适合范围查询和排序。


十九、binlog、redo log、undo log 分别是什么

推荐回答

  • undo log:回滚和 MVCC
  • redo log:崩溃恢复和持久性
  • binlog:server 层逻辑日志,主从复制和恢复

面试更稳的说法

我理解这三种日志不是背定义,而是知道事务、恢复、复制这三件事分别依赖哪一层日志。


二十、MySQL 是怎么实现事务的

推荐回答

事务最终是靠几类能力一起实现的:

  • undo log 保证回滚
  • redo log 保证持久化
  • 锁和 MVCC 保证隔离性
  • 约束和业务规则共同保证一致性

面试更稳的说法

我理解事务不是单靠某一个日志就能完成,而是回滚、持久化、并发控制和业务约束共同作用的结果。


三、怎么用这份补充题库

建议你这样刷:

  1. 先把“索引链”讲顺
  • B+ 树
  • 聚簇索引
  • 回表
  • 覆盖索引
  • 最左前缀
  • 索引下推
  1. 再把“执行链”讲顺
  • SQL 执行过程
  • explain
  • 排序
  • 慢 SQL
  1. 最后把“事务链”讲顺
  • ACID
  • undo / redo / binlog
  • MVCC

只要这三条链能讲顺,MySQL 面试基本就不会显得散。