1. MySQL 面试核心知识点解析
MySQL作为最流行的关系型数据库之一,在技术面试中占据重要地位。我整理了多年面试和被面试的经验,将MySQL核心知识点分为以下几个关键部分进行深入解析。
1.1 存储引擎对比与选型
InnoDB和MyISAM是MySQL最常用的两种存储引擎,它们的核心差异体现在:
事务支持:
- InnoDB完整支持ACID事务特性,适合需要事务保证的业务场景
- MyISAM不支持事务,适合读多写少且不需要事务的场景
锁机制:
- InnoDB采用行级锁,并发写入性能更好
- MyISAM使用表级锁,在高并发写入场景下容易出现锁竞争
索引结构:
- InnoDB使用聚簇索引,数据文件本身就是索引文件
- MyISAM使用非聚簇索引,数据文件和索引文件分离
崩溃恢复:
- InnoDB有完善的崩溃恢复机制,通过redo log保证数据安全
- MyISAM崩溃后修复时间较长,可能丢失部分数据
生产环境建议:除非特别简单的只读场景,否则都应选择InnoDB引擎。MySQL 8.0已经将InnoDB作为默认引擎,MyISAM逐渐被淘汰。
1.2 索引原理与优化实践
B+树索引深度解析
MySQL的InnoDB引擎使用B+树作为索引结构,相比B树有以下优势:
- 非叶子节点只存储键值,不存储数据,使得单个节点可以存储更多键值
- 叶子节点通过双向链表连接,范围查询效率更高
- 所有数据都存储在叶子节点,查询稳定性更好
索引优化实战技巧:
- 遵循最左前缀原则:对于复合索引(a,b,c),只有查询条件包含a时索引才会生效
- 避免索引失效场景:
- 对索引列使用函数或运算
- 隐式类型转换
- 使用!=或<>操作符
- 使用前导通配符的LIKE查询
- 使用覆盖索引减少回表操作
聚簇索引与二级索引
InnoDB的表数据本身就是按照主键组织的聚簇索引。如果没有显式定义主键:
- 首先选择第一个非空的唯一索引作为聚簇索引
- 如果都没有,InnoDB会隐式创建一个6字节的ROWID作为聚簇索引
二级索引(非聚簇索引)的叶子节点存储的是主键值,查询时需要先查二级索引再查主键索引,这个过程称为"回表"。
