PostgreSQL索引物理布局

PostgreSQL索引物理布局,postgresql,b-tree-index,Postgresql,B Tree Index,我试图理解PostgreSQL物理索引布局是如何的。我所知道的是,索引是作为具有B树数据结构的页面集的一部分存储的。我试图理解真空化是如何影响索引的。它有助于控制它的大小吗?B-tree索引是一种已有十年历史的技术,因此web搜索将显示大量良好的详细描述。简言之: B树是索引页的平衡树(PostgreSQL中为8KB),也就是说,树的每个分支都具有相同的深度。 树通常是颠倒绘制的,起始(顶部)节点是根节点,底部的页面称为叶节点。 树的每一级划分搜索空间;级别越深,分区就越精细,直到在叶节点中达到

我试图理解PostgreSQL物理索引布局是如何的。我所知道的是,索引是作为具有B树数据结构的页面集的一部分存储的。我试图理解真空化是如何影响索引的。它有助于控制它的大小吗?

B-tree索引是一种已有十年历史的技术,因此web搜索将显示大量良好的详细描述。简言之:

B树是索引页的平衡树(PostgreSQL中为8KB),也就是说,树的每个分支都具有相同的深度。 树通常是颠倒绘制的,起始(顶部)节点是根节点,底部的页面称为叶节点。 树的每一级划分搜索空间;级别越深,分区就越精细,直到在叶节点中达到各个索引项为止。 索引页中的每个条目都指向一个表条目(在叶节点中)或下一级的另一个索引页

这是深度为3的索引示意图,但请注意以下几点:

  • 有些节点被省略,实际上所有叶节点都在级别3上
  • 实际上,这里不是一个节点中的三个条目(键),而是大约100个

一些注意事项:

  • 下一级的指针实际上位于条目之间的间隙中,在索引中搜索就像“向下钻取”到正确的叶页
  • 每个节点也与其同级链接,以便于插入和删除节点
  • 当一个节点已满时,它将被拆分为两个新节点。这种拆分可以递归,甚至可以到达根节点。分割根节点时,索引的深度增加1
  • 在现实生活中,B树索引的深度很难超过5
  • 删除索引项时,将保留一个空白。有一些技术可以通过加入页面来巩固这一点,但这很棘手,PostgreSQL不能做到这一点
现在谈谈你的问题:

当表(堆)项被
VACUUM
删除时,因为它对于任何活动快照都不可见,索引中的相应项也会被删除。这会导致索引中出现空白,将来的索引项可以重用这些空白

可以删除空索引页,但索引深度永远不会减少。因此,大规模删除可以(在
VACUUM
完成其工作后)减少索引大小,但更可能导致索引膨胀,页面只包含很少的键和大量的空白空间


一定数量的索引膨胀(高达50%以上)是正常的,但如果不寻常的使用模式(如批量更新和删除)导致索引膨胀不良,则必须使用
REINDEX
重写索引,从而消除膨胀。不幸的是,此操作会锁定索引,因此在完成之前,所有并发访问都会被阻止。

B-tree索引是一种已有十年历史的技术,因此web搜索将显示大量良好的详细描述。简言之:

B树是索引页的平衡树(PostgreSQL中为8KB),也就是说,树的每个分支都具有相同的深度。 树通常是颠倒绘制的,起始(顶部)节点是根节点,底部的页面称为叶节点。 树的每一级划分搜索空间;级别越深,分区就越精细,直到在叶节点中达到各个索引项为止。 索引页中的每个条目都指向一个表条目(在叶节点中)或下一级的另一个索引页

这是深度为3的索引示意图,但请注意以下几点:

  • 有些节点被省略,实际上所有叶节点都在级别3上
  • 实际上,这里不是一个节点中的三个条目(键),而是大约100个

一些注意事项:

  • 下一级的指针实际上位于条目之间的间隙中,在索引中搜索就像“向下钻取”到正确的叶页
  • 每个节点也与其同级链接,以便于插入和删除节点
  • 当一个节点已满时,它将被拆分为两个新节点。这种拆分可以递归,甚至可以到达根节点。分割根节点时,索引的深度增加1
  • 在现实生活中,B树索引的深度很难超过5
  • 删除索引项时,将保留一个空白。有一些技术可以通过加入页面来巩固这一点,但这很棘手,PostgreSQL不能做到这一点
现在谈谈你的问题:

当表(堆)项被
VACUUM
删除时,因为它对于任何活动快照都不可见,索引中的相应项也会被删除。这会导致索引中出现空白,将来的索引项可以重用这些空白

可以删除空索引页,但索引深度永远不会减少。因此,大规模删除可以(在
VACUUM
完成其工作后)减少索引大小,但更可能导致索引膨胀,页面只包含很少的键和大量的空白空间

一定数量的索引膨胀(高达50%以上)是正常的,但如果不寻常的使用模式(如批量更新和删除)导致索引膨胀不良,则必须使用
REINDEX
重写索引,从而消除膨胀。不幸的是,此操作会锁定索引,因此在完成之前,所有并发访问都会被阻止

                                     ┌───────────┐
                level 1 (root node)  │ 20 75 100 │
                                     └───────────┘
                                   ╱    ╱   │     ╲
                                  ╱    ╱    │      ╲
                                 ╱    ╱     │       ╲
                    ┌───────────┐┌─────┐┌──────────┐┌─────┐
           level 2  │ 5  10  15 ││ ... ││ 80 87 95 ││ ... │
                    └───────────┘└─────┘└──────────┘└─────┘
                                       ╱   ╱   │    ╲
                                      ╱   ╱    │     ╲
                                     ╱   ╱     │      ╲
                             ┌─────┐┌─────┐┌──────────┐┌─────┐
        level 3 (leaf nodes) │ ... ││ ... ││ 89 91 92 ││ ... │
                             └─────┘└─────┘└──────────┘└─────┘