PostgreSQL的btree索引是如何实现多版本并发控制的?

How does the btree index of PostgreSQL achieve multi-version concurrency control?

PostgreSQL使用MVCC技术进行数据库并发控制,每次写入都会创建一个item的新版本,然后通过visibility访问那个版本rules.The问题是btree索引是如何实现多版本控制的?当new添加 btree 节点并拆分树,将更改原始 btree 结构。这个时候PGSQL是怎么处理的?有人能告诉我吗?

在 PostgreSQL 中,索引不实现 MVCC。索引包含任何人可能感兴趣的每一行,从已插入但尚未提交的行到完全过时但尚未清除的行。您必须访问 table 本身以查看该行是否对您感兴趣。

这方面有一些优化。在仅索引扫描中,您有时可以参考 table 的可见性映射,而不是 table 本身的主要部分。此外,如果查询在索引中查找一行,然后转到 table 并发现该行对于所有用途都已过时,则当它返回索引时,它可以将其标记为死在索引中,以便将来查询不需要访问 table.

When new btree nodes are added and the tree is split, the original btree structure will be changed. At this time, how is PGSQL processed?Can someone tell me?

我不认为这真的是一个堆栈溢出类型的问题。所有细节的最佳参考是源代码和源注释。也许您只是想知道如果事务回滚会发生什么。页面拆分仍然存在,插入的元组会一直留在那里,直到 vacuum 将其删除(此时页面拆分仍然存在)。

在发生崩溃的情况下,要么播放描述拆分的 WAL 记录,要么不播放。由于在描述拆分的 WAL 记录被刷新到磁盘之前无法写出被拆分弄脏的页面(直到那时它们在 shared_buffers 中受到保护),系统将以任何一种方式处于一致状态。