在MySQL中,聚簇索引(Clustered Index)和非聚簇索引(Non-Clustered Index)是两种不同类型的索引,它们在数据存储和查询性能上有不同的特点:
- 聚簇索引(Clustered Index) 聚簇索引决定了表中数据的物理存储顺序。在聚簇索引中,非叶子节点的键值顺序决定了磁盘上数据页的顺序。 - 一个表只能有一个聚簇索引,通常是由主键自动创建的。
- 聚簇索引的叶子节点直接包含行数据,即索引和数据是存储在一起的。 - 聚簇索引对于范围查询特别有效,因为数据在物理上是相邻存储的。
- 非聚簇索引(Non-Clustered Index) 非聚簇索引的顺序与数据的物理存储顺序无关,它需要两个查找步骤:首先在索引中查找键值,然后在表中查找对应的数据。 - 一个表可以有多个非聚簇索引。
- 非聚簇索引的叶子节点通常包含指向数据页的指针或行标识符,而不是直接包含数据本身。
- 回表 “回表”是一个查询过程中的概念,特别是在使用非聚簇索引时。当查询涉及非聚簇索引中的列,但需要的数据列没有包含在索引中时,就需要回表操作。 - 回表过程通常包括以下步骤:
- 首先在非聚簇索引中查找满足条件的键值。 2. 然后使用索引中的行标识符或指针回到主键索引(或表)中查找对应的行数据。 - 这个过程可能需要额外的I/O操作,因此可能会降低查询性能。
InnoDB存储引擎中主键索引通常是聚簇索引,而其他索引(如唯一索引或普通索引)是非聚簇索引。聚簇索引由于其数据和索引紧密集成,可提供更快的范围查询性能,但更新聚簇索引可能更昂贵,因为可能涉及数据的物理移动。
为了减少回表操作,可以创建覆盖索引(Covering Index),即一个索引包含所有查询所需的列,这样查询可以直接使用索引而不需要访问表中的实际数据行。这可以提高查询效率,减少I/O操作。
- 首先在非聚簇索引中查找满足条件的键值。 2. 然后使用索引中的行标识符或指针回到主键索引(或表)中查找对应的行数据。 - 这个过程可能需要额外的I/O操作,因此可能会降低查询性能。