在 MySQL 中,InnoDB 是最常用的存储引擎,它支持事务、行级锁和外键约束等功能,而索引则是提升数据库查询性能的关键。在 InnoDB 存储引擎中,索引不仅仅是提高查询速度的工具,还是数据库的核心组成部分之一。本文将详细介绍 InnoDB 存储引擎的索引结构、索引种类、索引优化技巧以及索引失效等方面的知识。
1. InnoDB 索引的结构
在 InnoDB 存储引擎中,索引主要分为两种类型:聚集索引(Clustered Index)和非聚集索引(Non-clustered Index)。
1.1 聚集索引(Clustered Index)
- 聚集索引的叶子节点存储的是数据行本身。换句话说,数据行的实际数据存储在索引结构中,索引的顺序就是数据的物理存储顺序。
- 每个表只能有一个聚集索引,通常是主键索引。
- 聚集索引通过将表的数据按索引顺序存储,从而提高了对主键字段查询的效率。
1.2 非聚集索引(Non-clustered Index)
- 非聚集索引的叶子节点并不存储数据行本身,而是存储数据行的指针(通常是聚集索引的主键值)。因此,查询时需要通过指针再次访问数据行。
- 一个表可以有多个非聚集索引。
1.3 InnoDB 索引的 B+ 树结构
InnoDB 存储引擎中的聚集索引和非聚集索引通常都是基于 B+ 树(自平衡的树状数据结构)来实现的。B+ 树有以下特点:
- 平衡性:所有叶子节点都位于同一层,因此查询的时间复杂度是 O(log N)。
- 有序性:叶子节点之间按照大小顺序排列,可以进行范围查询。
- 高效的插入和删除操作:通过自平衡机制,插入和删除操作能保持树的平衡。
2. InnoDB 索引的类别
InnoDB 支持以下几种类型的索引:
2.1 主键索引(Primary Key Index)
- 主键索引是一种特殊的聚集索引,用来确保表中每一行的唯一性。InnoDB 表默认使用主键作为聚集索引。
- 如果没有显式定义主键,InnoDB 会自动选定一个唯一索引作为主键。
2.2 唯一索引(Unique Index)
- 唯一索引保证索引列的值是唯一的,但允许 NU