1-003:MySQL 的索引类型有哪些?_mysql四种索引类型
MySQL 中的索引类型主要分为以下几类,每种索引都有不同的适用场景和优化查询的作用:
1. 按存储结构分类
① 聚簇索引(Clustered Index)
- 特点:
- InnoDB 引擎的 主键索引 就是 聚簇索引。
- 数据与索引存储在一起,索引的叶子节点就是数据本身。
- 每张表只能有一个聚簇索引(一般是主键)。
- 按照主键值的物理顺序存储数据,提高主键范围查询效率。
- 适用场景:高效的 主键查询,需要顺序存储的数据结构(如 B+ 树)。
② 非聚簇索引(Secondary Index / Non-Clustered Index)
- 特点:
- 普通索引、唯一索引等都属于非聚簇索引。
- 索引的叶子节点存储的是主键值,而不是数据本身。
- 查询时需要回表查找实际数据(多了一次查询)。
- 一个表可以有多个非聚簇索引。
- 适用场景:非主键查询,如按姓名、邮箱等字段查询。
2. 按功能分类
① 普通索引(Index / Secondary Index)
-
特点:
- 最基础的索引类型,加速 WHERE 语句查询。
- 叶子节点存储的是主键值,需要回表查询数据。
-
适用场景
: 在 查询频繁的列(非主键)上加索引,比如
name
、email
等字段。
② 唯一索引(Unique Index)
-
特点
: 和普通索引类似,但索引列的值必须唯一。
- 如果定义了唯一索引,在插入数据时会进行唯一性检查。
-
适用场景
: 适用于 身份证号、邮箱、用户名 等字段。
③ 复合索引(Composite Index / Multi-Column Index)
-
特点
: 多个字段组成的索引,提高多条件查询效率。
- 遵循最左匹配原则:索引的作用取决于查询语句的字段顺序。
-
适用场景:
- 查询涉及 多个字段,如
(name, age, city)
联合查询。
- 查询涉及 多个字段,如
④ 全文索引(Full-Text Index)
- 特点:
- 用于 全文搜索,支持
MATCH() ... AGAINST()
语法。 - 适用于 长文本字段,如
TEXT
或VARCHAR
字段。
- 用于 全文搜索,支持
- 适用场景:
- 适用于 文章内容、博客搜索,但一般推荐使用 Elasticsearch 进行全文检索。
⑤ 空间索引(Spatial Index,R-Tree)
- 特点:
- 适用于存储地理信息,支持 GIS 数据类型(如
POINT
、POLYGON
)。 - 只能用于
MyISAM
引擎(InnoDB 8.0 开始支持)。
- 适用于存储地理信息,支持 GIS 数据类型(如
- 适用场景:
- 地理位置查询,如 地图应用、LBS(基于位置的服务)。
3. 按物理存储方式分类
① B+ 树索引(B+Tree Index)
- MySQL 默认索引(InnoDB 使用 B+ 树)。
- 适用于 大部分查询,如主键查询、范围查询、排序查询。
② 哈希索引(Hash Index)
- 仅适用于 等值查询,不支持范围查询、排序查询。
- Memory 引擎默认使用哈希索引。
③ R-Tree 索引(R-Tree Index)
- 用于 地理空间数据(如坐标、地图数据)。
- 适用于 地理范围查询(如查找某个范围内的地点)。
总结:如何选择合适的索引?
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 优化,正确选择索引可以显著提高查询性能!🚀