Skip to content

MySQL 的索引分为哪几种

约 1295 字大约 4 分钟

MySQL阿里

2025-09-18

⭐ 题目日期:

阿里 - 2025/8/19

📝 详细题解

MySQL 的索引主要可以分为以下几种:

  1. 按数据结构分

    • B+树索引:这是 MySQL 中最常用、也是默认的索引类型。B+树是一种多路平衡查找树,其所有数据都存储在叶子节点上,并且叶子节点之间通过双向链表连接。这种结构非常适合范围查询。InnoDB 存储引擎就使用 B+树作为其索引结构。
    • 哈希索引:哈希索引基于哈希表实现,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,并在哈希表中保存这个哈希码和指向对应行的指针。哈希索引的查询速度极快,理论上接近 O(1)O(1),但它只支持精确匹配查询,不支持范围查询、前缀匹配等,也不支持排序。Memory 存储引擎支持哈希索引。
  2. 按物理存储分

    • 聚簇索引(Clustered Index):聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。InnoDB 存储引擎中的主键索引就是聚簇索引。它的特点是,数据行本身就存储在 B+树的叶子节点上。因此,一张表只能有一个聚簇索引。由于数据行和索引紧密地存储在一起,通过聚簇索引查询数据非常快。
    • 二级索引(Secondary Index)/非聚簇索引:除了聚簇索引之外的索引都是二级索引。它的特点是,叶子节点存储的不是数据行本身,而是主键值。当通过二级索引查询时,会先找到主键值,然后再通过主键值去聚簇索引中找到完整的行数据,这个过程称为回表(Back-to-table)
  3. 按逻辑角色分

    • 主键索引(Primary Key Index):特殊的一种聚簇索引。一个表只能有一个主键,且主键列必须是唯一且非空的。
    • 唯一索引(Unique Index):索引列中的值必须是唯一的,但可以为空(多个 NULL)。它用于保证数据的唯一性。
    • 普通索引(Normal Index):也叫非唯一索引或非聚簇索引。最基本的索引类型,没有任何限制。
    • 全文索引(Full-Text Index):用于在文本列上进行关键字查询,常用于模糊查询,类似于搜索引擎的功能。InnoDB 和 MyISAM 存储引擎都支持。
    • 联合索引(Composite Index):在多个列上创建的索引。遵循最左前缀原则,即查询时从索引的最左边的列开始匹配,可以匹配到多个列。

📝 面试回答

MySQL 的索引类型可以从多个维度进行划分,我主要从数据结构物理存储逻辑角色这三个角度来总结。

首先是按数据结构划分,主要有两种:

  1. B+树索引:这是 MySQL 最常用、也是默认的索引类型。它的特点是所有数据都存储在叶子节点,并且叶子节点之间通过双向链表连接,这非常利于范围查询。InnoDB 和 MyISAM 存储引擎都支持这种索引。
  2. 哈希索引:它基于哈希表,查询速度非常快,接近 O(1)O(1)。但它的局限性也很明显,只支持精确匹配,不支持范围查询、排序和前缀匹配,并且在哈希冲突较多时性能会下降。Memory 存储引擎支持哈希索引。

其次是按物理存储划分,分为聚簇索引非聚簇索引

  1. 聚簇索引:它并不是一个独立的索引类型,而是 InnoDB 存储引擎的一种数据存储方式。它的核心特点是数据行本身就和索引存储在一起,即 B+树的叶子节点直接存储了完整的行数据。一个表只能有一个聚簇索引,通常就是主键索引。
  2. 非聚簇索引(也叫二级索引):除了聚簇索引之外的索引都属于非聚簇索引。它的叶子节点存储的不是数据行,而是主键值。因此,通过二级索引查询数据时,需要先找到主键,再通过主键去聚簇索引中找到完整的数据行,这个过程也叫回表

最后,按逻辑角色划分,索引可以分为:

  • 主键索引:一个表只能有一个,唯一且非空。
  • 唯一索引:列值唯一,但可以为空。
  • 普通索引:最基本的索引类型,没有任何约束。
  • 全文索引:主要用于在文本内容上进行关键字查询。
  • 联合索引:在多个列上创建的索引,需要注意最左前缀原则

总的来说,在实际工作中,我们主要接触的是基于 B+树的、聚簇和非聚簇索引。合理利用这些索引,可以极大地提升数据库的查询性能。