17

聚集索引如何存储在硬盘上?什么是逻辑顺序?

非聚集索引如何工作?

4

6 回答 6

23

这意味着表中的数据按照(或聚类列)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)

于 2010-02-15T13:22:15.850 回答
5

对于非聚集索引,将创建一个单独的文件,该文件仅包含索引字段,其中记录按逻辑索引顺序放置。对于聚集索引,没有单独的文件——来自表本身的数据(所有字段)按索引的逻辑顺序放置。

这使得对索引的查找更快(尽管它确实是最好的索引,例如您将要查找范围的日期)。如果将记录插入中间,它也会使插入相当慢。

于 2010-02-15T13:23:06.037 回答
3

聚集索引存储

聚集索引的工作方式基本上与所有其他索引的工作方式完全相同——它们存储在称为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 开发,你的系统也会变得越快。我保证。

于 2010-02-15T13:48:44.293 回答
2

这意味着聚集索引确定了表中记录实际存储的物理顺序。非聚集索引只是单独存储的键值列表,可以在聚集/物理排序之外的其他排序中进行快速查找。

快速示例:一个带有ID(主键)的表FirstName,包含三个人:0=The Stig (Llana), 1=Jeremy Clarkson (DB9), 2=Richard Hammond (911), 3=James May (Lambo) and a聚集索引 on和非聚集索引 on将按照磁盘上的物理顺序存储表中的实际数据行:LastNameCarLastNameCar

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
于 2010-02-15T13:24:14.963 回答
0

这意味着该表是按照为聚集索引指定的顺序排列的。非聚集索引在物理上是分开存储的。

于 2010-02-15T13:23:37.423 回答
-3

主索引在技术上不是“聚集”索引,尽管两者都会对数据进行物理排序。区别就在他们的名字上。主索引处理主键。这意味着,每个主键都必须是唯一的(否则它将不是主键)。聚簇索引处理任何不是主键的东西,根据定义,可以允许它是非唯一的。这就是“集群”一词的由来。如果您对非主要数据进行排序,则意味着它可以重复。当重复的数据一起出现时,它被认为是一个“集群”。

于 2013-03-04T04:40:57.403 回答