MySQL
大约 5 分钟
阅读提示
建议先打透 4 条主线:执行流程、索引、事务与锁、日志与高可用。
回答优化题时优先使用“定位 -> 原因 -> 方案 -> 验证”四步结构。
推荐训练法
- 第一遍建立题目地图,先不追细节。
- 第二遍吃透高频:索引、隔离级别、MVCC、日志。
- 第三遍按线上场景口述:慢 SQL、死锁、主从延迟。
1、一个查询语句是怎么执行的?
回答提示:
- 连接器(鉴权) -> 解析器(词法/语法) -> 优化器(执行计划) -> 执行器(调用存储引擎)。
参考回答:
- 关键是“优化器决定怎么查”,不是“按 SQL 写的顺序机械执行”。
2、InnoDB 和 MyISAM 有什么区别?
- InnoDB 支持事务,MyISAM 不支持。
- InnoDB 支持行锁,MyISAM 主要是表锁。
- InnoDB 支持外键,MyISAM 不支持。
- InnoDB 使用聚簇索引。
3、什么是索引?为什么能加速查询?
回答提示:
- 索引相当于“有序目录”,减少扫描范围。
- 通过更少的磁盘 IO 定位目标记录。
4、B+ 树为什么适合数据库索引?
- 多路平衡树,层高低,磁盘 IO 次数少。
- 叶子节点有序且可链式遍历,范围查询性能好。
- 内部节点只存键值,单页可容纳更多索引项。
5、聚簇索引和非聚簇索引的区别
回答提示:
- 聚簇索引:数据与主键顺序组织在一起。
- 二级索引(非聚簇):叶子节点存主键值,可能回表。
6、什么是回表?如何减少回表?
- 二级索引查到主键后,再到主键索引取整行,叫回表。
- 尽量使用覆盖索引(查询列都在索引里)。
- 控制
select *,只查必要列。
7、什么是最左前缀匹配原则?
回答提示:
- 联合索引从最左列开始连续命中才更容易走索引。
- 跳过前导列通常会导致索引效果下降。
8、哪些情况会导致索引失效?
- 对索引列做函数/计算。
- 隐式类型转换。
- 前导模糊查询(如
%abc)。 - 联合索引不满足最左匹配。
9、事务的 ACID 分别是什么?
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
10、隔离级别有哪些?MySQL 默认是什么?
- Read Uncommitted
- Read Committed
- Repeatable Read(MySQL InnoDB 默认)
- Serializable
11、脏读、不可重复读、幻读分别是什么?
- 脏读:读到未提交数据。
- 不可重复读:同一事务两次读同一行结果不同。
- 幻读:同一事务两次范围查询结果行数不同。
12、什么是 MVCC?
回答提示:
- 多版本并发控制,通过隐藏字段 + Read View 让读写并发更高效。
参考回答:
- MVCC 主要优化“读不阻塞写、写不阻塞读”的并发体验。
13、InnoDB 常见锁有哪些?
- 行锁
- 间隙锁(Gap Lock)
- 临键锁(Next-Key Lock)
- 意向锁
14、什么情况下会发生死锁?如何处理?
回答提示:
- 两个事务互相持有对方需要的锁。
- 处理方式:统一加锁顺序、缩小事务、降低持锁时间、失败重试。
15、delete、truncate、drop 的区别
delete:删除数据,可带条件,可回滚(在事务中)。truncate:清空表数据,DDL 行为,通常更快。drop:删除表结构和数据。
16、redo log、undo log、binlog 的区别
- redo log:InnoDB 物理日志,保证崩溃恢复。
- undo log:逻辑回滚与 MVCC 历史版本。
- binlog:Server 层逻辑日志,用于主从复制与归档。
17、为什么需要“两阶段提交”?
回答提示:
- 保证 redo log 与 binlog 一致,避免主从数据不一致。
18、什么是 Buffer Pool?
- InnoDB 的内存缓存区,缓存数据页和索引页。
- 命中 Buffer Pool 可以显著减少磁盘 IO。
19、慢 SQL 排查一般怎么做?
- 先看慢日志与执行频次。
- 用
EXPLAIN看执行计划(type、rows、extra)。 - 定位是否走索引、是否回表、是否临时表/文件排序。
- 优化后压测验证。
20、主从复制原理是什么?
- 主库写 binlog。
- 从库 IO 线程拉取 binlog 写 relay log。
- 从库 SQL 线程回放 relay log。
21、主从延迟怎么治理?
- 读写分离时对强一致读回源主库。
- 缩短大事务,避免批量慢写。
- 优化从库硬件和并行回放能力。
22、为什么要分库分表?
- 单表/单库达到容量和吞吐瓶颈后,通过拆分提升扩展性。
23、分库分表常见问题有哪些?
- 分布式事务。
- 跨库 join 困难。
- 全局 ID 设计。
- 分页与排序复杂度提升。
24、如果单表千万级后变慢,一般怎么优化?
- 优化索引与 SQL。
- 冷热数据归档。
- 分区表或分库分表。
- 引入缓存与读写分离。
25、面试可直接复述模板
- 我做 MySQL 优化时,先通过慢日志和 EXPLAIN 定位瓶颈,再判断是索引问题、SQL 写法问题还是数据分布问题。
- 对高频查询优先做覆盖索引,减少回表和随机 IO。
- 对高并发场景会结合缓存、限流和读写分离,确保峰值流量下稳定性。
