聚簇索引和非聚簇索引(图文详解)

聚簇索引和非聚簇索引(图文详解)-mikechen

聚簇索引和非聚簇索引是数据库必备技能,下面我就重点来详解聚簇索引和非聚簇索引@mikechen

什么是聚簇索引

聚簇索引,全称是Clustered Index,是数据库中一种重要的索引类型,它对表中的数据行进行物理排序和存储。

如下图所示:

聚簇索引和非聚簇索引(图文详解)-mikechen

聚簇索引会将表的数据行物理上按照索引的顺序进行排列,在聚簇索引下表中的数据行实际上就是索引的叶子节点。

在具有聚簇索引的表中,数据行的物理存储顺序与索引的顺序一致,这使得聚簇索引在数据访问和查询性能方面具有重要作用。

以下是聚簇索引的一些关键特点:

  1. 物理排序: 表中的数据行按照聚簇索引的键值进行物理排序,而不仅仅是逻辑上的排序。
  2. 唯一性: 一张表只能有一个聚簇索引,通常会与主键关联。
  3. 范围查询: 由于数据行在物理上相邻存储,范围查询,例如:在某个范围内查找数据的性能通常会很好,因为相关数据可能在磁盘上连续。
  4. 顺序扫描: 对于需要按照顺序扫描表中数据的操作,比如:导出数据或生成报表,聚簇索引能够提供更高的性能。

 

什么是非聚簇索引

非聚簇索引与数据的物理存储顺序无关,非聚簇索引会创建一个独立的数据结构,包含了索引键的值以及指向实际数据行的指针。

如下图所示:

聚簇索引和非聚簇索引(图文详解)-mikechen

非聚簇索引是独立于数据存储顺序的索引,它包含索引键的值以及指向实际数据行的指针,一张表可以有多个非聚簇索引。

以下是非聚簇索引的一些关键特点:

  1. 独立于数据排序: 与聚簇索引不同,非聚簇索引并不会改变数据行的物理存储顺序,它只是在索引中维护了索引键值和指向数据行的指针。
  2. 多个索引: 一张表可以有多个非聚簇索引,每个索引可以针对不同的列或列组合。
  3. 索引键和指针: 非聚簇索引的索引键值用于快速定位数据行,而指针则指向包含实际数据的位置。
  4. 覆盖索引: 如果非聚簇索引包含了查询所需的所有列,就称为覆盖索引。

需要注意的是,虽然非聚簇索引可以显著提高查询性能,但由于它们需要额外的存储空间来维护索引结构,过多的索引可能会导致写操作的性能下降。

 

聚簇索引和非聚簇索引的区别

聚簇索引和非聚簇索引之间的核心区别主要体现在数据存储方式、索引结构和性能优化方面。

以下是它们的核心区别:

1. 数据存储方式:

  • 聚簇索引:数据行的物理存储顺序与聚簇索引的键值顺序一致,数据行在磁盘上相邻存储。
  • 非聚簇索引:数据行的物理存储顺序与索引无关,索引结构中包含索引键值和指向实际数据行的指针。

2. 主键关联:

  • 聚簇索引:通常与表的主键相关联,主键的值必须是唯一的。
  • 非聚簇索引:可以与表的主键关联,也可以与非主键列关联。

3. 数据插入和更新的影响:

  • 聚簇索引:插入新数据或更新聚簇索引的键值可能导致数据行的重新排序,这可能会引起性能开销。
  • 非聚簇索引:插入或更新数据行不会导致数据的物理重新排序,因为索引与实际数据的存储位置无关。

4. 数据存储量和性能:

  • 聚簇索引:可能需要更多的存储空间来维护物理排序,适合范围查询和顺序扫描。
  • 非聚簇索引:可以适用于特定列的查询,避免了物理排序带来的性能开销。

5. 多索引支持:

  • 聚簇索引:一张表只能有一个聚簇索引。
  • 非聚簇索引:一张表可以有多个非聚簇索引,每个索引用于不同的查询优化。

6. 覆盖索引的支持:

  • 聚簇索引:聚簇索引一般不用于覆盖索引。
  • 非聚簇索引:非聚簇索引可以成为覆盖索引,包含了查询所需的列,避免了额外的磁盘访问。

综上所述,聚簇索引与数据的物理排序和存储紧密相关,而非聚簇索引提供了更灵活的索引结构来优化特定列的查询。

陈睿mikechen

十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法