> 技术文档 > 1-003:MySQL 的索引类型有哪些?_mysql四种索引类型

1-003:MySQL 的索引类型有哪些?_mysql四种索引类型

MySQL 中的索引类型主要分为以下几类,每种索引都有不同的适用场景和优化查询的作用:


1. 按存储结构分类

① 聚簇索引(Clustered Index)
  • 特点:
    • InnoDB 引擎的 主键索引 就是 聚簇索引
    • 数据与索引存储在一起,索引的叶子节点就是数据本身。
    • 每张表只能有一个聚簇索引(一般是主键)。
    • 按照主键值的物理顺序存储数据,提高主键范围查询效率。
  • 适用场景:高效的 主键查询,需要顺序存储的数据结构(如 B+ 树)。
② 非聚簇索引(Secondary Index / Non-Clustered Index)
  • 特点:
    • 普通索引、唯一索引等都属于非聚簇索引
    • 索引的叶子节点存储的是主键值,而不是数据本身。
    • 查询时需要回表查找实际数据(多了一次查询)。
    • 一个表可以有多个非聚簇索引。
  • 适用场景:非主键查询,如按姓名、邮箱等字段查询。

2. 按功能分类

① 普通索引(Index / Secondary Index)
  • 特点:

    • 最基础的索引类型,加速 WHERE 语句查询
    • 叶子节点存储的是主键值,需要回表查询数据。
  • 适用场景

    : 在 查询频繁的列(非主键)上加索引,比如 nameemail 等字段。

② 唯一索引(Unique Index)
  • 特点

    : 和普通索引类似,但索引列的值必须唯一

    • 如果定义了唯一索引,在插入数据时会进行唯一性检查。
  • 适用场景

    适用于 身份证号、邮箱、用户名 等字段。

③ 复合索引(Composite Index / Multi-Column Index)
  • 特点

    多个字段组成的索引,提高多条件查询效率。

    • 遵循最左匹配原则:索引的作用取决于查询语句的字段顺序。
  • 适用场景:

    • 查询涉及 多个字段,如 (name, age, city) 联合查询。
④ 全文索引(Full-Text Index)
  • 特点:
    • 用于 全文搜索,支持 MATCH() ... AGAINST() 语法。
    • 适用于 长文本字段,如 TEXTVARCHAR 字段。
  • 适用场景:
    • 适用于 文章内容、博客搜索,但一般推荐使用 Elasticsearch 进行全文检索。
⑤ 空间索引(Spatial Index,R-Tree)
  • 特点:
    • 适用于存储地理信息,支持 GIS 数据类型(如 POINTPOLYGON)。
    • 只能用于 MyISAM 引擎(InnoDB 8.0 开始支持)。
  • 适用场景:
    • 地理位置查询,如 地图应用、LBS(基于位置的服务)

3. 按物理存储方式分类

① B+ 树索引(B+Tree Index)
  • MySQL 默认索引(InnoDB 使用 B+ 树)。
  • 适用于 大部分查询,如主键查询、范围查询、排序查询。
② 哈希索引(Hash Index)
  • 仅适用于 等值查询,不支持范围查询、排序查询。
  • Memory 引擎默认使用哈希索引
③ R-Tree 索引(R-Tree Index)
  • 用于 地理空间数据(如坐标、地图数据)。
  • 适用于 地理范围查询(如查找某个范围内的地点)。

总结:如何选择合适的索引?

索引类型 特点 适用场景 聚簇索引 数据存储与索引结合,提高主键查询效率 主键查询、顺序存储 非聚簇索引 叶子节点存主键值,查询需回表 非主键查询、普通索引 普通索引 加速查询,但不保证唯一性 高频查询字段 唯一索引 索引列值必须唯一 身份证号、邮箱 复合索引 多列联合索引,最左匹配原则 多个条件联合查询 全文索引 支持全文搜索 文章、博客内容检索 空间索引 适用于地理信息查询 地图、LBS 应用

4. 图解

MySQL 索引类型│├── **按存储结构分类**│ ├── 聚簇索引(Clustered Index)│ │ ├── 主键索引│ │ ├── 数据与索引存储在一起│ │ ├── 物理存储按索引排序│ │ ├── 每张表只能有一个│ │ ├── 适用于 **主键查询、高效范围查询**│ ││ ├── 非聚簇索引(Secondary Index / Non-Clustered Index)│ ├── 普通索引、唯一索引等属于非聚簇索引│ ├── 叶子节点存储的是主键值,需要回表查询│ ├── 一个表可以有多个非聚簇索引│ ├── 适用于 **非主键查询**│├── **按功能分类**│ ├── 普通索引(Index)│ │ ├── 最常见的索引类型│ │ ├── 加速 `WHERE` 条件查询│ │ ├── 适用于 **高频查询字段**│ ││ ├── 唯一索引(Unique Index)│ │ ├── 确保列值唯一│ │ ├── 插入时进行唯一性检查│ │ ├── 适用于 **身份证号、邮箱、用户名**│ ││ ├── 复合索引(Composite Index)│ │ ├── 由多个列组成的索引│ │ ├── 遵循 **最左匹配原则**│ │ ├── 适用于 **多个条件联合查询**│ ││ ├── 全文索引(Full-Text Index)│ │ ├── 用于 **全文搜索**│ │ ├── 适用于 **长文本字段**│ │ ├── 需要 `MATCH() ... AGAINST()`│ │ ├── 适用于 **文章、博客搜索**│ ││ ├── 空间索引(Spatial Index)│ ├── 适用于 **GIS(地理信息系统)**│ ├── 仅支持 `MyISAM`InnoDB 8.0+ 支持)│ ├── 适用于 **地图、LBS(基于位置的服务)**│├── **按物理存储方式分类**│ ├── B+ 树索引(B+Tree Index)│ │ ├── **MySQL 默认索引结构**│ │ ├── 适用于 **大部分查询**│ ││ ├── 哈希索引(Hash Index)│ │ ├── 仅适用于 **等值查询**│ │ ├── 适用于 **Memory 引擎**│ ││ ├── R-Tree 索引(R-Tree Index)│ ├── 用于 **地理空间数据**│ ├── 适用于 **范围查询**│└── **索引的选择建议** ├── **普通查询** → 普通索引 ├── **唯一性约束** → 唯一索引 ├── **多字段联合查询** → 复合索引 ├── **全文搜索** → 全文索引 ├── **地理信息** → 空间索引 ├── **主键查询** → 聚簇索引 ├── **高并发等值查询** → 哈希索引

5. 结论

  • 普通查询: 使用 普通索引(Index)
  • 唯一性约束: 使用 唯一索引(Unique Index)
  • 多字段联合查询: 使用 复合索引
  • 全文搜索: 使用 全文索引
  • 地理信息: 使用 空间索引
  • 主键查询: 依赖 聚簇索引
  • 高并发等值查询(如缓存表): 使用 哈希索引

如果你的业务涉及大数据查询、复杂 SQL 优化,正确选择索引可以显著提高查询性能!🚀