🎯 什么是索引?
索引是数据库中一种用于提高查询效率的数据结构,类似于书籍的目录。通过索引,MySQL 可以快速定位到目标数据,而不需要全表扫描。
✅ MySQL 中的索引类型(常见)
类型名称 | 说明 |
---|---|
主键索引 | 唯一标识一条记录,不能为 NULL,自动创建为聚簇索引 |
唯一索引 | 唯一性约束,不允许重复值,但允许 NULL |
普通索引 | 最基本的索引类型,没有唯一性要求 |
联合索引 | 多列组成的复合索引,遵循“最左前缀”原则 |
全文索引 | 支持全文检索,适合英文文本 |
空间索引 | 用于 GIS 空间数据,如点、面,基于 R-Tree 实现 |
✅ MySQL 索引底层实现机制
默认存储引擎 InnoDB 下,索引通常基于 B+ 树(B+Tree) 结构实现。
✅ 聚簇索引(Clustered Index)
-
InnoDB 的主键索引就是聚簇索引。
-
数据和索引存储在同一棵 B+ 树的叶子节点。
-
所以表中只能有一个聚簇索引。
✅ 二级索引(Secondary Index)
-
非主键的索引都是二级索引。
-
叶子节点存储的是主键值,通过主键再去回表查询数据(“回表”)。
✅ B+ 树索引的特点
-
所有值都存在叶子节点,中间节点只做导航。
-
每个节点能存储大量数据页,降低树的高度,提高检索效率。
-
查询是从根节点开始,逐层向下,最终到叶子节点,时间复杂度约为 O(logₙN)。
⚠️ 最左前缀原则(联合索引重点)
对联合索引如
(a, b, c)
,支持以下查询:
-
WHERE a=...
✅ -
WHERE a=... AND b=...
✅ -
WHERE b=...
❌ 不走索引(不满足最左前缀)
✅ 索引的优点
-
提高查询效率,降低 IO 次数(特别是大表)
-
加快排序、分组、连接等操作
-
可以约束数据唯一性(如唯一索引)
❌ 索引的缺点
-
占用额外的磁盘空间
-
影响写入性能(增删改时需要维护索引)
-
滥用或冗余索引会导致优化器选择错误路径
🧠 面试加分点(你说出来就赢了)
-
✅ 索引失效情况(会导致全表扫描):
-
使用
LIKE '%abc'
前缀通配符 -
在索引列上做运算(如
WHERE age+1 = 30
) -
隐式类型转换(如字符串和整型比较)
-
不遵守最左前缀原则
-
-
✅ 覆盖索引(Covering Index):
-
查询的字段都在索引中,避免回表,提高性能
-
EXPLAIN
中出现Using index
-
-
✅ 避免使用冗余索引与重复索引:
-
索引数量要精简,一个查询只会选择最优的一个索引路径
-
🧠 记忆口诀:索引五字诀
“左、树、聚、回、失”
口诀 | 含义 |
---|---|
左 | 最左前缀原则 |
树 | 底层数据结构是 B+ 树 |
聚 | 聚簇索引与主键绑定 |
回 | 二级索引需回表查询主键数据 |
失 | 索引失效情况要牢记 |
✅ 一句话收尾总结(面试用):
MySQL 索引基于 B+ 树结构设计,默认使用聚簇索引优化数据存储和访问。在开发中应根据业务查询场景合理创建联合索引,理解最左前缀原则和索引失效场景,从而最大化利用索引带来的性能收益。