PostgreSQL 索引如何处理 MVCC

How PostgreSQL index deals with MVCC

在 PostgreSQL 中,元组的每次更新都会创建新的元组版本。所以在一段时间内,相同的元组可能有很多版本,不同的交易可以看到不同版本的元组(使用可见性规则)

索引在交易完成前更新。这如何与 SI 一起使用?

所以当一个事务更新元组然后索引条目更新为指向新版本的元组时?

由于 PostgreSQL 通过同时在 table 中保留一行的多个版本来实现 MVCC,它还 为单个数据的不同版本保留多个索引条目行(有时这可以通过 heap-only tuples 避免,如果索引条目在更新期间没有被修改并且更新的行与原始版本在同一个 table 块中).

可见性信息未存储在索引中,因此要在索引扫描期间找到正确的行版本,必须检查所有这些索引条目的 table 条目(有时这可以避免,如果已知索引块仅包含对所有人可见的条目;这是 仅索引扫描)。

在 autovacuum 期间,旧的索引条目与旧的 table 条目一起被删除。