MySQL面试题深度解析

2025年 阅读约 13 分钟 面试指南 · 数据库面试

深入MySQL面试核心考点,涵盖存储引擎、索引原理、事务隔离级别、锁机制等高频面试题。

一句话总结

MySQL 是后端面试必问,核心考点:存储引擎(InnoDB vs MyISAM)、索引(B+树+聚簇索引+覆盖索引+最左前缀)、事务(ACID+MVCC+隔离级别)、锁(行锁+间隙锁+Next-Key Lock 防幻读)。

存储引擎

Q:InnoDB和MyISAM的区别?

InnoDB:支持事务、行级锁、外键、MVCC、崩溃恢复。聚簇索引存储,主键索引和数据在一起。

MyISAM:不支持事务和行锁,表级锁。非聚簇索引,索引和数据分开存储。查询速度快,适合读多写少场景。

MySQL 5.5后默认引擎为InnoDB,推荐使用InnoDB。

索引原理

Q:MySQL索引的底层数据结构?

InnoDB使用B+树作为索引结构。B+树的特点:
1. 非叶子节点只存键值,不存数据,一个页能存更多键值
2. 叶子节点通过双向链表连接,范围查询高效
3. 树高度低(3-4层),查找效率高

聚簇索引:主键索引,叶子节点存完整行数据。一张表只有一个。

二级索引:非主键索引,叶子节点存主键值。查询非索引列需要回表。

覆盖索引:查询的列都在索引中,无需回表。

事务与隔离级别

ACID特性:原子性、一致性、隔离性、持久性。

四种隔离级别:
1. READ UNCOMMITTED:可能脏读、不可重复读、幻读
2. READ COMMITTED:解决脏读(Oracle默认)
3. REPEATABLE READ:解决不可重复读(MySQL默认)
4. SERIALIZABLE:解决幻读,性能差

MVCC原理:通过隐藏列(trx_id、roll_pointer)和Undo Log实现快照读。READ COMMITTED每次读生成新快照,REPEATABLE READ首次读生成快照。

锁机制

锁的分类:
1. 全局锁:FTWRL,备份时使用
2. 表级锁:表锁、元数据锁、意向锁
3. 行级锁:Record Lock、Gap Lock、Next-Key Lock

Next-Key Lock:Record Lock + Gap Lock,左开右闭区间。InnoDB在REPEATABLE READ级别下使用Next-Key Lock防止幻读。

死锁:两个事务互相等待对方持有的锁。InnoDB自动检测死锁,回滚代价较小的事务。

实战场景

场景:EXPLAIN 分析慢查询

-- 查看执行计划 EXPLAIN SELECT * FROM orders WHERE user_id = 100 AND status = 'paid'; -- 关键字段解读: -- type: ALL(全表) < index < range < ref < eq_ref < const(最优) -- key: 实际使用的索引 -- rows: 预估扫描行数 -- Extra: Using index(覆盖索引) / Using filesort(需优化) -- 优化:创建联合索引 CREATE INDEX idx_user_status ON orders(user_id, status); -- 验证优化效果 EXPLAIN SELECT * FROM orders WHERE user_id = 100 AND status = 'paid'; -- type=ref, key=idx_user_status, rows 大幅减少