
2025年Java面试宝典获取地址:
点击下载{:style="color:blue"}
MySQL索引原理详解
在数据库面试中,MySQL索引原理几乎是必考题。本文将从底层数据结构、索引类型、索引优化等角度,系统解析这一高频考点。
什么是索引?
索引是帮助MySQL高效获取数据的数据结构,类似于书籍的目录。它通过预排序和快速定位机制,将全表扫描的时间复杂度从O(n)降低到O(log n)。对于千万级数据表,合理使用索引可以将查询速度提升数百倍。
索引的底层数据结构
B+树结构
MySQL索引默认使用B+树结构(如图)。与B树相比,B+树有两大核心优势:
- 非叶子节点仅存储键值,不存储数据,单个节点可容纳更多索引值
- 叶子节点形成有序链表,范围查询效率更高

Hash索引
虽然Hash索引查询时间复杂度为O(1),但存在以下局限:
- 不支持范围查询
- 哈希碰撞影响性能
- 内存需求大
因此InnoDB仅在Memory引擎支持Hash索引。
聚簇索引 vs 非聚簇索引
聚簇索引
- 叶子节点存储完整数据行
- 每个表只能有一个聚簇索引
- InnoDB主键索引即聚簇索引
非聚簇索引
- 叶子节点存储主键值
- 需要回表查询数据
- 普通索引、唯一索引均属于此类
最左匹配原则
联合索引(a,b,c)的生效规则:
- 必须包含最左列a才能使用索引
- 遇到范围查询(>、<、between)后,后续列无法使用索引
- 跳过中间列会导致索引部分失效
示例:
WHERE a=1 AND b>2 AND c=3→ 仅a、b走索引WHERE b=2 AND c=3→ 索引失效
索引失效的六大场景
- 未遵循最左前缀原则
- 索引列使用函数或计算
WHERE YEAR(create_time) = 2024 - 隐式类型转换
WHERE phone = 13800138000(phone为varchar类型) - LIKE以通配符开头
WHERE name LIKE '%张' - OR条件包含非索引列
- 全表扫描成本更低
当优化器判断需要访问超过30%数据时,可能放弃索引
索引优化策略
- 覆盖索引优化
通过联合索引包含查询字段,避免回表操作 - 索引下推(ICP)
MySQL5.6+将WHERE条件过滤下推到存储引擎层 - 前缀索引
对长字符串取前N个字符建立索引 - 索引合并
优化器自动合并多个单列索引的条件
高频面试问题解析
Q:为什么建议使用自增主键?
A:自增主键保证插入顺序与B+树叶子节点顺序一致,避免页分裂带来的性能损耗。
Q:如何查看索引使用情况?
A:通过EXPLAIN查看执行计划,重点关注:
- type列(index表示走索引扫描)
- key列(实际使用的索引)
- rows列(预估扫描行数)

温馨提示:如果需要购买《面试鸭》会员,可通过面试鸭返利网联系我,可额外返利25元。更多数据库优化技巧,请下载上方提供的面试宝典资源。


