首页 文章

这句话是什么意思:聚集索引物理存储在表中?

提问于
浏览
15

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

非聚集索引如何工作?

6 回答

  • 4

    这意味着表中的数据根据 CLUSTERED PRIMARY KEY (或聚类列)的顺序存储在 B-Tree 中 .

    这个名字在我看来有点令人困惑 . 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
    

    该表是 id 的订货人,索引在 (col1, id) 上订购

  • -3

    对于非聚簇索引,将创建一个单独的文件,该文件仅包含索引字段,该文件的记录按逻辑索引顺序排列 . 对于聚簇索引,没有单独的文件 - 表本身(所有字段)中的数据按索引的逻辑顺序放置 .

    这使得对索引的查找更快(尽管它确实是最好的索引,比如你将查找范围的日期) . 如果将记录插入中间,它也会使插入速度变慢 .

  • 0

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

    快速示例:包含 ID (主键), FirstNameLastNameCar 的表包含三个人:0 = Stig(Llana),1 = Jeremy Clarkson(DB9),2 = Richard Hammond(911),3 = James May( Lambo)和 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
    
  • 2

    Clustered Index Storage

    聚簇索引从根本上与所有其他索引的工作方式完全相同 - 它们存储在称为B-Tree的结构的变体中 . 它们存储在相同的文件中,格式与SQL Server中的所有其他表格相同 .

    The Concept

    退一步思考您正在编制索引的数据 . (我希望你能想到这本书中的一本书) . 如果除了在书的末尾有索引之外,你还订购了书中的数据怎么办?您可以更快地查找信息 . 以电话簿为例,其中所有数据均按姓氏和名字排序 . 您无需到电话簿的背面查找某人的电话号码 . 与历史书相比,你必须到书后面的索引找到你想要的东西 .

    从逻辑上讲,聚集索引(或Oracle中的"index-organized table")是您的数据,但已排序 . 物理上,B树的叶节点按排序顺序包含所有表的数据 . 当您在连续范围(例如日期范围)上扫描表格中的数据时,这非常有用 .

    关于聚簇索引的另一个重要事项(至少在SQL Server中)是您的聚类列(即构成聚簇索引排序方式的列)包含在您在表上定义的每个非聚簇索引的末尾 . 这样可以非常快速地搜索您的群集列,这在OLAP数据库中通常是非常需要的 .

    Nonclustered Indexes

    您的表只能存储在一个物理订单中 . 但有时您需要以其他方式查找数据 . 对于这些方案,您使用非聚簇索引 . 这也是作为B树实现的,但它对表数据的顺序没有任何影响,比如聚簇索引确实 . 这意味着如果您希望表中的数据未包含在非聚集索引中,则SQL Server必须在物理上查找表中的数据才能获得所需内容 . 这是另一项操作,对于许多查询来说可能成本很高,并且在优化表时是一个关键的设计考虑因素 .

    A word

    你可以写一本关于这些东西的书 . 很多人都有 . 如果我没有't bored you to death already, check out Wikipedia' s B-Tree页面 . 从那里开始 . 如果你涉及're still (really) interested, I suggest actually programming a simple B-Tree so you can see what' . 而且,如果您想更深入地了解SQL Server如何存储所有这些内容,请查看Kalen Delaney的Inside SQL Server: The Storage Engine . 所有这些都是过度杀戮吗?那是给你决定的 . 但是你学习的越多,你对DB开发的熟悉程度就越高,你的系统就会越快 . 我承诺 .

  • 2

    它表示按照聚簇索引的指定对表进行排序 . 非聚集索引是物理存储的 .

  • 20

    主索引在技术上不是“聚簇”索引,但两者都会导致对数据进行物理排序 . 他们的名字显而易见 . 主索引处理主键 . 意思是,每个主键必须是唯一的(否则它不是主键) . 聚类索引处理任何非主键的内容,并且根据定义,可以允许它是非唯一的 . 这就是“集群”这个词的来源 . 如果您对非主要数据进行排序,则表示它可以重复 . 当重复数据一起出现时,它被视为“群集” .

相关问题