MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引

MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引
最新回答
暗中人

2026-10-23 11:35:28

MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引

一、聚簇索引

聚簇索引(Clustered Index)实际上并不是一种单独的索引类型,而是一种数据存储方式。聚簇索引的叶子节点保存了一行记录的所有列信息,也就是说,聚簇索引的叶子节点中,包含了一个完整的记录行。在InnoDB存储引擎中,每个表必须有一个聚簇索引,默认是根据主键建立的。如果表中没有主键,InnoDB会选择一个合适的列作为聚簇索引,如果找不到合适的列,会使用一列隐藏的列DB_ROW_ID作为聚簇索引。

二、非聚簇索引

非聚簇索引(Non-Clustered Index)也叫辅助索引、普通索引,它的叶子节点只包含一个主键值。通过非聚簇索引查找记录要先找到主键,然后通过主键再到聚簇索引中找到对应的记录行,这个过程被称为“回表”。非聚簇索引的叶子节点中不包含整个记录的完整信息,除了索引字段本身以外,只包含当前记录的主键id。因此,如果想要获取整行记录数据,还需要再通过主键号到聚簇索引中回表查询。

三、联合索引

联合索引指的是同时对多列创建的索引。创建联合索引后,叶子节点会同时包含每个索引列的值,并且同时根据多列排序,这个排序和字典序类似。联合索引的使用要遵循最左前缀匹配原则,即只有按照索引列的顺序进行查询,才能使用到索引。例如,对列(A, B, C)创建索引,那么只有对列(A, B, C)、(A, B)或(A)进行查询时,才能匹配到索引。

联合索引中还有一些重要的概念:

  • 最左前缀匹配原则:只有按照索引列的顺序进行查询,才能使用到索引。
  • 索引下推:新版本的MySQL(5.6以上)中引入了索引下推的机制,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

四、唯一索引

唯一索引是一种不允许具有相同索引值的索引。系统在创建该索引时检查是否有重复的键值,每次对更新或增加记录时都会检查这一点。主键索引就是唯一索引的一种特殊形式。唯一索引保证了索引列中的值是唯一的,从而保证了数据的唯一性。

示例图片展示

以下是聚簇索引和非聚簇索引的结构示意图:

(聚簇索引的叶子节点中包含了完整的记录行)

(非聚簇索引的叶子节点中只包含了主键值和索引字段)

以下是联合索引的结构示意图:

(联合索引的叶子节点同时包含了多个索引列的值和主键值)

总结

  • 聚簇索引:叶子节点包含了完整的记录行,是数据存储的一种方式。
  • 非聚簇索引:叶子节点只包含主键值和索引字段,需要回表查询完整记录。
  • 联合索引:同时对多列创建的索引,遵循最左前缀匹配原则,可以减少查询次数。
  • 唯一索引:保证索引列中的值是唯一的,从而保证了数据的唯一性。