聚集索引如何存储在硬盘上?什么是逻辑顺序?
非聚集索引如何工作?
这意味着表中的数据按照(或聚类列)B-Tree
的顺序存储在一个中。CLUSTERED PRIMARY KEY
这个名字在我看来有点混乱。相同的概念Oracle
被称为index-organized table
,我发现它更具描述性。
非聚集索引包含索引列的值以及指向它们源自的记录的指针。
“聚集索引”是表本身;“非聚集”索引是表中某些列的有序副本。
如果您“创建”聚集索引,则会重新排列该表。这就是为什么您不能在一张表上拥有多个“聚集索引”:该表不能以多个顺序排列。
如果创建二级索引,则会创建表的影子副本,其中包含索引列的值和指向它们所在记录的指针。每当表更改时,副本也会更改(引擎会自动处理)。
id col1 value
-- -- --
1 1 Data 1
6 1 Data 6
3 1 Data 3
7 2 Data 7
9 2 Data 9
5 2 Data 5
该表未排序。
id col1 value
-- -- --
1 1 Data 1
3 1 Data 3
5 2 Data 5
6 1 Data 6
7 2 Data 7
9 2 Data 9
该表是在 上订购的id
。
Table Index
id col1 value col1 id
-- -- -- -- --
1 1 Data 1 1 1
3 1 Data 3 1 3
5 2 Data 5 1 6
6 1 Data 6 2 5
7 2 Data 7 2 7
9 2 Data 9 2 9
该表是 orderer on id
,索引是 orderer on(col1, id)
对于非聚集索引,将创建一个单独的文件,该文件仅包含索引字段,其中记录按逻辑索引顺序放置。对于聚集索引,没有单独的文件——来自表本身的数据(所有字段)按索引的逻辑顺序放置。
这使得对索引的查找更快(尽管它确实是最好的索引,例如您将要查找范围的日期)。如果将记录插入中间,它也会使插入相当慢。
聚集索引存储
聚集索引的工作方式基本上与所有其他索引的工作方式完全相同——它们存储在称为B-Tree的结构的变体中。它们存储在相同的文件中,格式与 SQL Server 中的所有其他表相同。
这个概念
退后一步,想想你正在索引的数据。(我希望你以这个类比思考一本书)。如果除了书末有索引之外,您还对书中的数据进行了排序怎么办?您可以更快地查找信息。以电话簿为例,其中所有数据都按姓氏和名字排序。您不必去电话簿的背面查找某人的号码。与一本历史书相比,你必须去书后的索引才能找到你想要的东西。
因此,从逻辑上讲,聚集索引(或 Oracle 中的“索引组织表”)是您的数据,但已排序。从物理上讲,B 树的叶节点按排序顺序包含表的所有数据。当您在连续范围(例如日期范围)上扫描表中的数据时,这非常有用。
关于聚集索引(至少在 SQL Server 中)的另一件重要事情是聚集列(即构成聚集索引排序方式的列)包含在您在表中定义的每个非聚集索引的末尾。这使得搜索集群列的速度非常快,这在 OLAP 数据库中通常是非常理想的。
非聚集索引
您的表格只能以一种物理顺序存储。但有时您需要以其他方式查找数据。对于这些场景,您可以使用非聚集索引。这也被实现为 B 树,但它与表数据的顺序没有任何关系,就像聚集索引一样。这意味着,如果您想要从您的表中获取未包含在非聚集索引中的数据,SQL Server 将不得不在您的表中物理查找数据以获得您想要的数据。这是另一项操作,对于许多查询而言,成本可能很高,并且是优化表时的关键设计考虑因素。
一个字
你可以写一本关于这些东西的书。许多有。如果我还没有让你厌烦至死,请查看 Wikipedia 的B-Tree页面。从那里开始。如果您仍然(真的)感兴趣,我建议您实际编写一个简单的 B-Tree,这样您就可以看到所涉及的内容。而且,如果您想更深入地了解 SQL Server 如何准确存储所有这些内容,请查看 Kalen Delaney 的Inside SQL Server:存储引擎。所有这些学习都是多余的吗?那是你来决定的。但是你研究得越多,你就会越适应 DB 开发,你的系统也会变得越快。我保证。
这意味着聚集索引确定了表中记录实际存储的物理顺序。非聚集索引只是单独存储的键值列表,可以在聚集/物理排序之外的其他排序中进行快速查找。
快速示例:一个带有ID
(主键)的表FirstName
,包含三个人:0=The Stig (Llana), 1=Jeremy Clarkson (DB9), 2=Richard Hammond (911), 3=James May (Lambo) and a聚集索引 on和非聚集索引 on将按照磁盘上的物理顺序存储表中的实际数据行:LastName
Car
LastName
Car
ID FirstName LastName Car
1 Jeremy Clarkson DB9
2 Richard Hammond 911
3 James May Lambo
0 The Stig Llana
非聚集索引也将存储如下内容:
Car ID
911 2
DB9 1
Lambo 3
Llana 0
这意味着该表是按照为聚集索引指定的顺序排列的。非聚集索引在物理上是分开存储的。
主索引在技术上不是“聚集”索引,尽管两者都会对数据进行物理排序。区别就在他们的名字上。主索引处理主键。这意味着,每个主键都必须是唯一的(否则它将不是主键)。聚簇索引处理任何不是主键的东西,根据定义,可以允许它是非唯一的。这就是“集群”一词的由来。如果您对非主要数据进行排序,则意味着它可以重复。当重复的数据一起出现时,它被认为是一个“集群”。