mysql索引面试精解

备战面试的同学注意:2025年Java面试宝典👉 网盘链接 提取码: 9b3g
一、索引的本质是加速查询
当面试官问“为什么加索引能变快”,别直接背B+树!想象一下:没有索引时查数据就像翻无目录的字典——只能逐页扫描。而索引就是给这本字典加了目录页。MySQL的InnoDB引擎用B+树索引实现目录功能,通过树形结构快速定位数据位置。
二、B+树索引的三大特征
- 多路平衡查找树:每个非叶子节点存储多个键值(比如[10,20,30]),大幅减少磁盘IO次数。三层高的B+树就能存2000万行数据!
- 叶子节点双向链表:范围查询时(如
WHERE id BETWEEN 100 AND 200),找到起点后直接遍历链表,避免回溯上层节点。 - 数据文件本身是索引:InnoDB的聚集索引(主键索引)中,叶子节点直接存完整数据行;而普通索引的叶子节点存主键值,需要二次查询(回表)。
三、高频面试题拆解
Q:为什么推荐用自增主键?
A:顺序写入时B+树只需追加页,避免页分裂。如果主键随机(如UUID),插入数据可能导致频繁页重组,举例:向已满的页插入数据,会拆分成两个新页(性能损耗!)。
Q:联合索引怎么用才生效?
A:记住口诀:最左匹配 + 无中断。比如索引(a,b,c):
✅ WHERE a=1 AND b>2 → 用到a、b列
❌ WHERE b=2 → 直接失效(跳过了a)
✅ WHERE a=1 ORDER BY c → 排序走索引
Q:索引覆盖是什么?
A:当查询字段都在索引中,无需回表。比如表有(id,name,age),索引是(name,age):
SELECT age FROM user WHERE name='Jack' → 直接取索引叶子节点数据
四、索引避坑指南
- 别乱建索引:索引占用空间,增删改时需要维护树结构。曾见某表20个索引,INSERT速度下降10倍!
- 区分度低的字段别建索引:比如性别字段只有男/女,走索引可能比全表扫描更慢(优化器会放弃使用!)
- 函数操作会让索引失效:
WHERE YEAR(create_time)=2023→ 即使create_time有索引也用不上
五、实战优化策略

遇到慢查询必做两步:
EXPLAIN看执行计划,重点关注:type列:index或ALL代表全表扫描key列:实际使用的索引
- 用
SHOW INDEX FROM table检查索引状态,关注Cardinality(基数),值越大区分度越高



