Postgres 如何自动更新二级索引?

How does Postgres atomically updates secondary indices?

我了解当事务执行更改时,Postgres mvcc 方案会存储包含更新数据的新行和关联版本。

其他交易知道他们应该看到哪些版本,并且他们选择适当的行。

我还了解到 table 的主索引存储了该行的所有版本。 我可以看到如何更新主索引(您将其锁定以进行写入,追加行,然后解锁。我不确定它是否是这样工作的,但这是一种潜在的方式)。

但是 Postgres 是如何自动更新二级索引的呢? 我想象当事务提交时,所有索引都需要用行中的新数据更新。

Postgres 是否获取所有二级索引的锁以自动更新它们? 如果是,那么锁的粒度是索引级别还是值级别(只针对特定值锁定索引的部分)?

InnoDB 等其他数据库引擎的方法是否相同?

我正在构建一个玩具数据库,我很难理解如何有效地更新二级索引。 也欢迎任何关于该主题的论文!

非常感谢!

PostgreSQL 不支持索引组织-tables。所以所有的索引都是二级索引。

索引不是自动更新的。在索引中看到有趣条目的进程会将其追查到 table。在 table 中,它看到该元组尚未提交,因此忽略它。系统安排为用户提供原子性体验,但在索引操作的级别上并没有真正的原子性。