快速示例:包含 ID (主键), FirstName , LastName 和 Car 的表包含三个人:0 = Stig(Llana),1 = Jeremy Clarkson(DB9),2 = Richard Hammond(911),3 = James May( Lambo)和 LastName 上的聚簇索引以及 Car 上的非聚集索引将以磁盘上的物理顺序存储表中的实际数据行:
ID FirstName LastName Car
1 Jeremy Clarkson DB9
2 Richard Hammond 911
3 James May Lambo
0 The Stig Llana
你可以写一本关于这些东西的书 . 很多人都有 . 如果我没有't bored you to death already, check out Wikipedia' s B-Tree页面 . 从那里开始 . 如果你涉及're still (really) interested, I suggest actually programming a simple B-Tree so you can see what' . 而且,如果您想更深入地了解SQL Server如何存储所有这些内容,请查看Kalen Delaney的Inside SQL Server: The Storage Engine . 所有这些都是过度杀戮吗?那是给你决定的 . 但是你学习的越多,你对DB开发的熟悉程度就越高,你的系统就会越快 . 我承诺 .
6 回答
这意味着表中的数据根据
CLUSTERED PRIMARY KEY
(或聚类列)的顺序存储在B-Tree
中 .这个名字在我看来有点令人困惑 .
Oracle
中的相同概念称为index-organized table
,我发现它更具描述性 .非聚集索引包含索引列的值以及指向它们源自的记录的指针 .
“聚集索引”是表本身; “非聚集”索引是某些表列的有序副本 .
如果“创建”聚簇索引,则会重新排列表 . 这就是为什么你不能在一个表上拥有多个“聚集索引”的原因:该表不能以多个顺序排列 .
如果创建辅助索引,则会创建表的卷影副本,其中包含索引列的值以及指向它们的记录的指针 . 每当表更改时,副本也会更改(引擎会自动处理) .
非群集表
该表未订购 .
集群表
该表在
id
订购 .具有二级索引的聚簇表
该表是
id
的订货人,索引在(col1, id)
上订购对于非聚簇索引,将创建一个单独的文件,该文件仅包含索引字段,该文件的记录按逻辑索引顺序排列 . 对于聚簇索引,没有单独的文件 - 表本身(所有字段)中的数据按索引的逻辑顺序放置 .
这使得对索引的查找更快(尽管它确实是最好的索引,比如你将查找范围的日期) . 如果将记录插入中间,它也会使插入速度变慢 .
这意味着聚簇索引确定了实际存储表中记录的物理顺序 . 非聚集索引只是单独存储的键值列表,可以按照除聚类/物理排序之外的其他顺序进行快速查找 .
快速示例:包含
ID
(主键),FirstName
,LastName
和Car
的表包含三个人:0 = Stig(Llana),1 = Jeremy Clarkson(DB9),2 = Richard Hammond(911),3 = James May( Lambo)和LastName
上的聚簇索引以及Car
上的非聚集索引将以磁盘上的物理顺序存储表中的实际数据行:非聚集索引也会存储如下内容:
Clustered Index Storage
聚簇索引从根本上与所有其他索引的工作方式完全相同 - 它们存储在称为B-Tree的结构的变体中 . 它们存储在相同的文件中,格式与SQL Server中的所有其他表格相同 .
The Concept
退一步思考您正在编制索引的数据 . (我希望你能想到这本书中的一本书) . 如果除了在书的末尾有索引之外,你还订购了书中的数据怎么办?您可以更快地查找信息 . 以电话簿为例,其中所有数据均按姓氏和名字排序 . 您无需到电话簿的背面查找某人的电话号码 . 与历史书相比,你必须到书后面的索引找到你想要的东西 .
从逻辑上讲,聚集索引(或Oracle中的"index-organized table")是您的数据,但已排序 . 物理上,B树的叶节点按排序顺序包含所有表的数据 . 当您在连续范围(例如日期范围)上扫描表格中的数据时,这非常有用 .
关于聚簇索引的另一个重要事项(至少在SQL Server中)是您的聚类列(即构成聚簇索引排序方式的列)包含在您在表上定义的每个非聚簇索引的末尾 . 这样可以非常快速地搜索您的群集列,这在OLAP数据库中通常是非常需要的 .
Nonclustered Indexes
您的表只能存储在一个物理订单中 . 但有时您需要以其他方式查找数据 . 对于这些方案,您使用非聚簇索引 . 这也是作为B树实现的,但它对表数据的顺序没有任何影响,比如聚簇索引确实 . 这意味着如果您希望表中的数据未包含在非聚集索引中,则SQL Server必须在物理上查找表中的数据才能获得所需内容 . 这是另一项操作,对于许多查询来说可能成本很高,并且在优化表时是一个关键的设计考虑因素 .
A word
你可以写一本关于这些东西的书 . 很多人都有 . 如果我没有't bored you to death already, check out Wikipedia' s B-Tree页面 . 从那里开始 . 如果你涉及're still (really) interested, I suggest actually programming a simple B-Tree so you can see what' . 而且,如果您想更深入地了解SQL Server如何存储所有这些内容,请查看Kalen Delaney的Inside SQL Server: The Storage Engine . 所有这些都是过度杀戮吗?那是给你决定的 . 但是你学习的越多,你对DB开发的熟悉程度就越高,你的系统就会越快 . 我承诺 .
它表示按照聚簇索引的指定对表进行排序 . 非聚集索引是物理存储的 .
主索引在技术上不是“聚簇”索引,但两者都会导致对数据进行物理排序 . 他们的名字显而易见 . 主索引处理主键 . 意思是,每个主键必须是唯一的(否则它不是主键) . 聚类索引处理任何非主键的内容,并且根据定义,可以允许它是非唯一的 . 这就是“集群”这个词的来源 . 如果您对非主要数据进行排序,则表示它可以重复 . 当重复数据一起出现时,它被视为“群集” .