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

发布于:2025-03-12 ⋅ 阅读:(14) ⋅ 点赞:(0)

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 优化,正确选择索引可以显著提高查询性能!🚀