繁体   English   中英

为什么主键应该是聚簇索引?

[英]Why are primary keys supposed to be clustered indexes?

我知道,一个表上只有一个聚簇索引定义了行的物理排序方式,例如在表中

==================================
            Contacts
==================================
 ID (P.K.) | FirstName | LastName
==================================
    1      | 'Donald'  | 'Trump'
----------------------------------
    2      | 'Crooked' | 'Hillary'
----------------------------------
    3      | 'Crazy'   | 'Bernie'

这意味着3条记录将按照上面显示的顺序进行物理存储。 但是我不明白为什么这有帮助。 像上面的示例一样,也许在没有间隙的自动递增主键的情况下,这有助于查询

SELECT FirstName+LastName FROM Contacts WHERE ID=2

因为如果ID=2O(1)时间内发生,则物理排序使查找成为可能(例如,通过索引获取数组的元素)。 但是如果桌子像

==================================
            Contacts
==================================
 ID (P.K.) | FirstName | LastName
==================================
    1      | 'Donald'  | 'Trump'
----------------------------------
    89     | 'Crooked' | 'Hillary'
----------------------------------
    12309  | 'Crazy'   | 'Bernie'

则物理顺序不允许进行 O(1)查找; 我们能做的最好的就是O(log(n))

那么,为什么我们要主键定义行的物理顺序?

SQL Server中的聚集索引的重要性不是“物理顺序”,而是B树的叶子页中有行数据的事实,从而避免了额外的查找。 子树成本与非聚集B树索引相同:O(log n)。

物理排序实际上是对聚集索引内部实际发生情况的抽象。 扩展数据块内的页面按分配顺序存储,而不必按聚簇索引键排序。 索引键排序在索引分配映射表和指针链中维护,由此每个页面都指向下一个(不一定是相邻的)页面。 在页面内,行也按照分配顺序(而不是键顺序)写入和存储,除非页面拆分,否则顺序不会改变。 重建索引时,页面本身将重新使用,但重建之间的顺序不会自动保持。

对于聚集索引,主键不一定是最佳选择。 这两个概念相互正交。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM