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%' 的高效替代方案)。
  • 适用场景

    • 文章内容、商品描述等文本字段的搜索。

索引类型对比

索引类型 数据结构 存储内容 是否唯一 适用查询类型 回表
主键索引 B+Tree 完整数据行 等值、范围查询
普通索引 B+Tree 主键值 + 索引字段 等值、范围查询
唯一索引 B+Tree 主键值 + 索引字段 等值查询
组合索引 B+Tree 主键值 + 多字段组合 多字段联合查询/排序
全文索引 倒排索引 关键词映射到文档 ID 文本模糊搜索