聚集索引
和非聚集索引
有什么区别?
聚集索引
和非聚集索引
有什么区别?
聚集索引
非聚集索引
当使用带有索引的字段选择数据时,两种类型的索引都会提高性能,但会减慢更新和插入操作。
由于插入和更新较慢,应将聚集索引设置在通常是增量的字段上,例如 Id 或 Timestamp。
SQL Server 通常仅在其可选性超过 95% 时使用索引。
聚集索引会按照物理顺序在磁盘上排列数据。这意味着索引不需要额外的数据,但是只能有一个聚集索引(显然)。使用聚集索引访问数据是最快的。
所有其他索引必须是非聚集索引。非聚集索引将索引列的数据副本保持在一起,并带有指向实际数据行的指针(如果有聚集索引,则为指向聚集索引的指针)。这意味着通过非聚集索引访问数据必须经过额外的间接层。但是,如果您仅选择可在索引列中使用的数据,则可以直接从复制的索引数据中获取数据(这就是为什么建议仅选择所需列并不使用 * 的原因)。
聚集索引被物理存储在表中,这意味着它们是最快的,每个表只能有一个聚集索引。
非聚集索引是单独存储的,你可以拥有任意数量的非聚集索引。
最佳选择是将聚集索引设置在最常用的唯一列上,通常是主键。除非出现了非常令人信服的理由(我想不到任何一个,但是嘿,可能存在),否则您应该在表中始终选择良好的聚集索引。
除了这些区别外,您还需要知道,当表是非聚集的(即表没有聚集索引)时,数据文件是无序的,并使用堆数据结构作为数据结构。
优点:
对于范围查询(如 select * from my_table where my_key between @min and @max),聚集索引效果非常好。
在某些情况下,如果使用 orderby 语句,DBMS 不必进行排序工作。
缺点:
如果新键不是按顺序的,聚集索引可能会减慢插入速度,因为记录的物理布局必须随着记录的插入而修改。
Clustered基本上意味着数据在表中按物理顺序排列。这就是为什么每个表只能有一个。
Unclustered意味着它只是“逻辑顺序”。
聚集索引实际上描述了记录在磁盘上物理存储的顺序,这就是为什么只能有一个的原因。
非聚集索引定义了一个逻辑顺序,它与在磁盘上的物理顺序不匹配。
聚集索引实际上是索引列中数据的排序副本。
聚集索引的主要优势在于,当您的查询(查找)在索引中定位到数据时,则无需进行其他IO操作即可检索该数据。
在经常更新的表中维护聚集索引的开销可能会导致性能下降,因此创建非聚集索引可能更为可取。