PostgreSQL索引物理布局
我试图理解PostgreSQL物理索引布局是如何的。我所知道的是,索引是作为具有B树数据结构的页面集的一部分存储的。我试图理解真空化是如何影响索引的。它有助于控制它的大小吗?B-tree索引是一种已有十年历史的技术,因此web搜索将显示大量良好的详细描述。简言之: B树是索引页的平衡树(PostgreSQL中为8KB),也就是说,树的每个分支都具有相同的深度。 树通常是颠倒绘制的,起始(顶部)节点是根节点,底部的页面称为叶节点。 树的每一级划分搜索空间;级别越深,分区就越精细,直到在叶节点中达到各个索引项为止。 索引页中的每个条目都指向一个表条目(在叶节点中)或下一级的另一个索引页 这是深度为3的索引示意图,但请注意以下几点:PostgreSQL索引物理布局,postgresql,b-tree-index,Postgresql,B Tree Index,我试图理解PostgreSQL物理索引布局是如何的。我所知道的是,索引是作为具有B树数据结构的页面集的一部分存储的。我试图理解真空化是如何影响索引的。它有助于控制它的大小吗?B-tree索引是一种已有十年历史的技术,因此web搜索将显示大量良好的详细描述。简言之: B树是索引页的平衡树(PostgreSQL中为8KB),也就是说,树的每个分支都具有相同的深度。 树通常是颠倒绘制的,起始(顶部)节点是根节点,底部的页面称为叶节点。 树的每一级划分搜索空间;级别越深,分区就越精细,直到在叶节点中达到
- 有些节点被省略,实际上所有叶节点都在级别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 ││ ... │
└─────┘└─────┘└──────────┘└─────┘