了解多列主键的结构

understanding the structure of primary key over multiple columns

我正在尝试了解 SQL 服务器中的索引如何帮助提高 select 查询的性能。

所以我的理解是 sql 服务器在索引时使用了 b 树结构。

下面是一个简单的例子。

Day (Primary Key)   Race Winner
1                   Dave
2                   Jill
3                   Jake
…   
199                 Jody
200                 Sam

所以天数是我们的主键。在背景中使用了如下结构(或类似的东西——只是我找到的图像)。因此,如果想查询第 50 天的比赛获胜者,我可以使用下面的结构来查看它可以通过执行以下操作快速找到,

从根开始 > 下一个 1 – 100 > 下一个 1 – 50 & 然后进入叶 25 – 50,我相信它会搜索该叶中的数据行,直到找到第 50 天。此处包含的值是 50 还是指向包含该行其余数据的行的指针?

所以我可以看出这个例子比搜索整个 table 更快。但是我一直在寻找 table(简化版),如下所示,

Date            ID  SEC ID  AutoID
10th Jan 2015   ABC A123    1
10th Jan 2015   ABC A344    2
10th Jan 2015   DEF A123    3
10th Jan 2015   GHJ A344    4
20th Feb 2015   ABC A123    5
20th Feb 2015   ABC A344    6
20th Feb 2015   DEF A123    7
20th Feb 2015   GHJ A344    8

所以我可以使用所有 3 列来创建一个主键(自然键)或者人们提到使用标识列,即代理键。

我在这里迷路了。

索引将如何存储此数据并能够像第一个示例中那样快速检索它? “2015 年 1 月 10 日 ABCA123”的键值实际上没有任何意义(我可能错误地假设这里发生了什么——我相信索引结合了三列来创建一个唯一的值,并将其放入索引 table).在第一个示例中,我们的索引值实际上对数据有某种意义,即天数。

我也不明白sql服务器如何使用AutoID?在查询上面的数据时,我会在 where 条件中使用日期和 ID 列,所以 AutoID 似乎毫无意义?

Is the value contained here 50 & a pointer to the row which contains the rest of the data on that row?

视情况而定。在一个table(只能有一个)的聚簇索引中,叶子存储的是整行的数据。聚集索引是数据实际存储的地方。在非聚集索引中,叶子存储的是聚集索引列值,因此可以进行查找。

默认情况下,主键将成为聚簇索引,但这只是默认情况,因此任何一种情况都可能发生。

在多列索引中,是的,索引级别中存储的实际上是所有列的组合值。这就是为什么对于多列索引,索引仅在索引的最左边 n 列(n <= 数量索引中的列)用于搜索条件。

在您的第二个示例中,如果索引是按 DateIDSEC ID 定义的,并且您有一个带有 WHERE 的查询ID = 'ABC' 的子句那么索引就不能使用了——因为每个键的第一部分是 Date.