"clustered"在"clustered index"中的意思是什么?
"clustered"在"clustered index"中的意思是什么?
可能的重复问题:
大家好,
在“聚集索引”中,单词“聚集”是什么意思?我怀疑它与磁盘扇区使用有关。因为我模糊地记得,Windows将磁盘空间组织成由一个或多个512字节的扇区组成的“簇”。这两个概念有什么联系吗?
谢谢。
在“聚集索引(clustered index)”中,“聚集(clustered)”的含义是相似键值的记录在磁盘上存储在一起。因此,如果有一个只有一个整数列的键,值为“1”的记录将会被存储在值为“2”的记录旁边。如果有多个记录,比如问题ID和答案ID,那么所有属于一个特定问题的答案将会在磁盘上被分组在一起,这样可以更快地访问它们。
你可以在主键上创建一个非聚集索引;排序并不是其区别特征。
正如你所说,如果我想为一个非常大的表创建一个聚集索引,那么创建它会花费很多时间吗?因为会有很多数据重排。
但是,如果我们在创建表之后立即创建聚集索引,随后的数据插入/更新将会因为索引而延迟。这是一个两难的选择。似乎只有小规模查询可以从索引中受益。
这取决于情况;在同样的情况下,你应该考虑选择一个不可变的、单调递增的主键作为聚集索引,这样在插入和更新时就不需要重新排列。因此,你应该在向表中添加数据之前设置主键,以便能够按顺序插入。我已经在我的回答中添加了这个建议。
确实是一个选项。
个人而言,我认为日期/时间戳比自增主键更适合作为聚集索引的候选键。通常查询是在日期范围内进行的,所以这会给你带来很大的收益。维护非聚集整数索引是微不足道的,而聚集主键很少在ID是代理键时提供好处。
我同意,但一个考虑因素是聚集索引包含在所有非聚集索引中(这是它们指向聚集索引的方式),所以一个占用更多空间的聚集索引键(比如DATETIMEOFFSET
与INT
)将会在所有非聚集索引中被乘以。如果聚集索引不是UNIQUE
,SQL将会添加一个“唯一标识符”,使其变得更大,再加上另外 4 个字节。这可能会导致非常庞大的索引。进一步阅读:technet.microsoft.com/en-us/library/ms190639(v=sql.105).aspx
"clustered"在"clustered index"中的意思是物理上的记录顺序。非聚集索引仅仅是指向表中物理记录的"指针";它们按照它们的键的顺序排列,并包含键和任何包含列的数据。
考虑一本书的索引与其页码:索引包含一个按字母顺序排列的主题列表,可能还包含主题的摘要,但主题本身在引用的页码上。因此,页码将是聚集索引。
由此可见,应该选择一个不可变的、单调递增的主键作为聚集索引,这样在插入和更新时就不需要重新排列。
谢谢。所以,聚集=紧密存储。这有点类似于Windows磁盘扇区簇的概念,但并不相同。
所以,我在思考创建索引时肯定会有某种排序吧?
不,不是一样的;文件系统的簇是文件存储的最小离散单元。在这里,我们只关心逻辑排序;理论上,包含数据的磁盘页面可能在磁盘上的完全不同位置(尽管在实践中不太可能,因为性能会受到影响)。
是的,任何索引都按其键排序。
只是一些附带信息:我查了一下维基百科关于索引的相关信息,结果发现索引只是原始数据表的一个紧凑版本,提供更快的搜索体验。没有更多,也没有更少。