一句话总结
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自动检测死锁,回滚代价较小的事务。