ChatGPT解决这个技术问题 Extra ChatGPT

聚集索引和非聚集索引有什么区别?

clusterednon-clustered index 之间有什么区别?

每个表只能有一个聚集索引。但是还有很多其他的不同...
聚集索引实际上描述了记录物理存储在磁盘上的顺序,因此您只能拥有一个。非聚集索引定义了与磁盘上的物理顺序不匹配的逻辑顺序。
集群基本上意味着数据在表中是按物理顺序排列的。这就是为什么每张桌子只能有一个。非聚集意味着它“仅”是一个逻辑顺序。
@biri 什么是“逻辑”顺序?非聚集索引按物理顺序存储索引键,并存储指向表的指针,即聚集索引键。
@Stephanie Page:从表格的角度来看是合乎逻辑的。当然,非聚集索引在索引本身中是物理排序的。

M
Martynnw

聚集索引

每桌只有一个

由于数据以索引顺序物理存储,因此读取速度比非集群更快

非聚集索引

每桌可多次使用

插入和更新操作比聚集索引更快

Both types of index will improve performance when select data with fields that use the index but will slow down update and insert operations.

由于插入和更新速度较慢,因此应在通常为增量的字段(即 Id 或时间戳)上设置聚集索引。

SQL Server 通常仅在其选择性高于 95% 时才使用索引。


还有存储方面的考虑。在没有聚集索引的表中插入行时,这些行将背靠背存储在页面上,更新行可能会导致该行移动到表的末尾,留下空白空间并使表和索引碎片化。
你不必关心什么是x。您只需要知道,对于拥有数百万用户的应用程序,x 将非常重要
这纯粹是教条。它不是“因为数据是按顺序存储的,所以读取速度更快”。读取速度更快,因为您避免了索引读取和表读取。范围扫描(如果有意义的话)更快,因为数据是按顺序存储的。即聚类因子是完美的。
此外,95% 的记录必须是唯一的想法也是一种谬误。假设您有一个包含 1,000,000 行的表,并且您为包含 500,000 个键的列建立索引。 0% 是唯一的,但每个键返回一百万行中的 2 行。不管 0% 的记录是唯一的,这个索引绝对有用。
“数据以索引顺序物理存储”你是什么意思?在一个层面上,这是微不足道的,因为数据页和索引叶页是相同的——所以很明显,一个的排序描述了另一个的排序。但是,这不一定是任何特定的顺序,例如索引键 stackoverflow.com/questions/1251636/… 的顺序
r
rslite

聚集索引对磁盘上的数据进行物理排序。这意味着索引不需要额外的数据,但只能有一个聚集索引(显然)。使用聚集索引访问数据是最快的。

所有其他索引必须是非聚集的。非聚集索引具有来自索引列的数据的副本,这些数据与指向实际数据行的指针一起保持有序(如果存在则指向聚集索引的指针)。这意味着通过非聚集索引访问数据必须经过一个额外的间接层。但是,如果您仅选择索引列中可用的数据,您可以直接从重复的索引数据中获取数据(这就是为什么最好只选择您需要的列而不使用 *)


'但是,如果您仅选择索引列中可用的数据,您可以直接从重复的索引数据中获取数据' - 是的,这是首选聚集索引启发式的重要例外。我猜在这种情况下,您基本上有一个聚集索引,但您正在查询的表中的数据较少,因此可能可以更快地从磁盘读取它。
S
Santiago Cepas

聚集索引物理存储在表上。这意味着它们是最快的,每个表只能有一个聚集索引。

非聚集索引是单独存储的,您可以拥有任意数量的索引。

最好的选择是在最常用的唯一列上设置聚集索引,通常是 PK。您的表中应该始终有一个精心选择的聚集索引,除非有非常令人信服的理由——想不出一个,但是嘿,它可能就在那里——因为不这样做会出现。


您能否详细说明“我们的表中应该始终有一个聚集索引”?没有详细说明,该陈述完全是错误的,因为“总是”这个词
你是对的 Pacerier,一个人不应该轻易使用绝对陈述。虽然我不知道您不应该有一个精心选择的聚集索引的情况,但这种情况可能存在,所以我已经将我的答案更改为更通用的版本。
C
Community

聚集索引

一张表只能有一个聚集索引。通常在主键上进行。聚集索引的叶节点包含数据页。

非聚集索引

一个表只能有 249 个非聚集索引(直到 sql 版本 2005 以后的版本最多支持 999 个非聚集索引)。通常在任何键上进行。非聚集索引的叶节点不包含数据页。相反,叶节点包含索引行。


L
Lasitha Yapa

聚集索引

一张表中只能有一个聚集索引

对记录进行排序并按照顺序进行物理存储

数据检索比非聚集索引更快

不需要额外的空间来存储逻辑结构

非聚集索引

一个表中可以有任意数量的非聚集索引

不影响物理顺序。为数据行创建逻辑顺序并使用指向物理数据文件的指针

数据插入/更新比聚集索引快

使用额外的空间来存储逻辑结构

除了这些差异之外,您必须知道当表是非聚集的(当表没有聚集索引时)数据文件是无序的并且它使用堆数据结构作为数据结构。


P
Pritam Banerjee

优点:

聚集索引适用于范围(例如 select * from my_table where my_key between @min 和 @max)

在某些情况下,如果您使用 orderby 语句,DBMS 将不必进行排序工作。

缺点:

聚集索引可能会减慢插入速度,因为如果新键不按顺序排列,则必须在放入记录时修改记录的物理布局。


P
Pritam Banerjee

集群基本上意味着数据在表中的物理顺序。这就是为什么每张桌子只能有一个。

非聚集意味着它“仅”是一个逻辑顺序。


J
Josh

聚集索引实际上描述了记录物理存储在磁盘上的顺序,因此您只能拥有一个。

非聚集索引定义了与磁盘上的物理顺序不匹配的逻辑顺序。


s
supercat

索引数据库有两部分:一组以任意顺序排列的物理记录,以及一组索引,这些索引标识应读取记录以产生按某种标准排序的结果的顺序。如果物理排列和索引之间没有关联,那么按顺序读取所有记录可能需要进行大量独立的单记录读取操作。因为一个数据库可能能够在比读取两个不连续记录的时间更短的时间内读取数十个连续记录,如果索引中连续的记录也连续存储在磁盘上,则性能可能会有所提高。指定索引是聚集的将导致数据库做出一些努力(不同的数据库在多少方面有所不同)来安排事物,以便索引中连续的记录组在磁盘上是连续的。

例如,如果从一个空的非集群数据库开始并以随机顺序添加 10,000 条记录,则这些记录可能会按照添加顺序添加到末尾。按索引顺序读取数据库需要 10,000 次单记录读取。但是,如果要使用集群数据库,系统可能会在添加每条记录时检查之前的记录是否是自己存储的;如果发现是这种情况,它可能会将该记录与数据库末尾的新记录一起写入。然后,它可以查看移动记录所在的插槽之前的物理记录,并查看后面的记录是否由它自己存储。如果发现是这种情况,它可以将该记录移至该位置。使用这种方法会导致许多记录成对组合在一起,从而可能使顺序读取速度几乎翻倍。

实际上,集群数据库使用比这更复杂的算法。但是,需要注意的关键是在更新数据库所需的时间和顺序读取数据库所需的时间之间进行权衡。维护集群数据库将显着增加以任何会影响排序顺序的方式添加、删除或更新记录所需的工作量。如果数据库被顺序读取的频率比更新的频率高得多,那么集群可能是一个巨大的胜利。如果它会经常更新但很少按顺序读取,则集群可能会消耗很大的性能,特别是如果将项目添加到数据库的顺序独立于它们相对于集群索引的排序顺序时。


E
Ed Guiness

聚集索引本质上是索引列中数据的排序副本。

聚集索引的主要优点是,当您的查询(查找)在索引中定位数据时,不需要额外的 IO 来检索该数据。

维护聚集索引的开销,尤其是在频繁更新的表中,可能会导致性能下降,因此最好创建非聚集索引。


N
Nandkishor Nangre

您可能已经阅读了上述帖子的理论部分:

-我们可以看到的聚集索引直接指向记录,即直接记录,因此搜索所需的时间更少。此外,它不会占用任何额外的内存/空间来存储索引

-虽然,在非聚集索引中,它间接指向聚集索引,然后它将访问实际记录,由于它的间接性质,它需要更多的时间来访问。而且它需要自己的内存/空间来存储指数

https://i.stack.imgur.com/kFSWR.png


D
Deepak Mishra

// 抄自MSDN,非聚集索引的第二点在其他答案中没有明确提到。

集群的

聚集索引根据键值对表或视图中的数据行进行排序和存储。这些是索引定义中包含的列。每个表只能有一个聚集索引,因为数据行本身只能以一种顺序存储。

表中的数据行按排序顺序存储的唯一时间是表包含聚集索引时。当表具有聚集索引时,该表称为聚集表。如果表没有聚集索引,则其数据行存储在称为堆的无序结构中。

非聚集

非聚集索引具有与数据行分开的结构。非聚集索引包含非聚集索引键值,每个键值条目都有一个指向包含键值的数据行的指针。

从非聚集索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页是存储在堆还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位符是聚集索引键。


T
Techie Boy

聚集索引

聚集索引的检索速度更快,而插入和更新速度较慢。

一张表只能有一个聚集索引。

不需要额外的空间来存储逻辑结构。

确定数据在磁盘上的存储顺序。

非聚集索引

非聚集索引检索数据的速度较慢,而插入和更新的速度较快。

一个表可以有多个非聚集索引。

需要额外的空间来存储逻辑结构。

对磁盘上存储数据的顺序没有影响。