InnoDB 中的索引类型
主键索引(聚簇索引)
主键索引(Primary Key Index)是 InnoDB 的默认聚簇索引(Clustered Index),数据与索引存储在同一结构中。每个表只能有一个主键索引。
- 结构
- 基于 B+Tree 实现,叶子节点直接存储 完整数据行。
- 若未显式定义主键,InnoDB 会自动生成一个隐藏的
ROW_ID
作为聚簇索引。
- 特点
- 快速定位数据:通过主键查询时,只需一次 B+Tree 搜索即可获取数据。
- 数据排序:数据按主键顺序物理存储,范围查询效率高(如
WHERE id > 100
)。
- 适用场景
- 高频查询的主键字段(如自增 ID、业务唯一标识)。
二级索引(非聚簇索引)
二级索引(Secondary Index)是除主键外的其他索引,每个表可以有多个二级索引。
-
结构
- 基于 B+Tree 实现,叶子节点存储主键值(而非数据行)。
- 查询时需先通过二级索引找到主键,再通过主键索引获取完整数据(回表查询)。
-
类型
- 普通索引(INDEX):无唯一性约束,仅加速查询。
- 唯一索引(UNIQUE INDEX):强制字段值唯一,同时优化查询。
- 全文索引(FULLTEXT INDEX)(MySQL 5.6+):支持文本字段的全文搜索。
- 空间索引(SPATIAL INDEX)(MySQL 5.7+):支持地理空间数据类型(如
GEOMETRY
)。
-
特点
- 节省空间:仅存储主键值和索引字段。
- 覆盖索引优化:若查询字段均在索引中,可避免回表(如
SELECT indexed_col FROM table
)。
-
适用场景
- 高频查询的非主键字段(如用户手机号、订单时间等)。
组合索引(复合索引)
组合索引(Composite Index)是基于多个字段的二级索引(如 INDEX (col1, col2, col3)
)。
-
特点
- 最左前缀匹配原则:查询需从索引最左字段开始,否则无法命中(如
(col1, col2)
索引可支持WHERE col1 = 1
,但不支持WHERE col2 = 2
)。 - 排序优化:索引字段顺序影响排序效率(如
ORDER BY col1, col2
可利用索引排序)。
- 最左前缀匹配原则:查询需从索引最左字段开始,否则无法命中(如
-
适用场景
- 多字段联合查询或排序(如
WHERE col1 = 1 AND col2 = 2
)。
- 多字段联合查询或排序(如
自适应哈希索引(Adaptive Hash Index)
InnoDB 自动创建 的哈希索引,用于优化高频访问的索引字段。
-
特点
- 由 InnoDB 自动管理,无需手动创建。
- 仅缓存热点数据,内存不足时自动淘汰。
- 支持等值查询(如
WHERE id = 100
),不适用于范围查询。
-
适用场景
- 高频等值查询的索引字段(如主键或唯一索引)。
前缀索引(Prefix Index)
对长字段(如 VARCHAR(255)
)的前 N 个字符建立索引,减少索引存储空间。
- 语法
CREATE INDEX idx_prefix ON table (column_name(N));
-
特点
- 需平衡前缀长度与选择性(避免重复前缀过多)。
- 无法用于排序或覆盖索引优化。
-
适用场景
- 长文本字段(如地址、备注)的部分匹配查询。
全文索引(FULLTEXT Index)
专为文本字段设计的索引,支持自然语言搜索和关键词匹配。
-
特点
- 基于倒排索引(Inverted Index)实现,支持
MATCH ... AGAINST
语法。 - 适用于模糊搜索(如
WHERE content LIKE '%keyword%'
的高效替代方案)。
- 基于倒排索引(Inverted Index)实现,支持
-
适用场景
- 文章内容、商品描述等文本字段的搜索。
索引类型对比
索引类型 | 数据结构 | 存储内容 | 是否唯一 | 适用查询类型 | 回表 |
---|---|---|---|---|---|
主键索引 | B+Tree | 完整数据行 | 是 | 等值、范围查询 | 否 |
普通索引 | B+Tree | 主键值 + 索引字段 | 否 | 等值、范围查询 | 是 |
唯一索引 | B+Tree | 主键值 + 索引字段 | 是 | 等值查询 | 是 |
组合索引 | B+Tree | 主键值 + 多字段组合 | 否 | 多字段联合查询/排序 | 是 |
全文索引 | 倒排索引 | 关键词映射到文档 ID | 否 | 文本模糊搜索 | 是 |