0

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

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

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

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

Postgres 是否会锁定所有二级索引以自动更新它们?如果是这样,锁定的粒度是在索引级别还是在值级别(仅锁定特定值的索引部分)?

其他数据库引擎(如 InnoDB)中的方法是否相同?

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

非常感谢!

4

1 回答 1

1

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

索引不会自动更新。在索引中看到有趣条目的进程将把它追到表中。在表中,它看到该元组尚未提交,因此忽略它。系统安排向用户呈现原子性的体验,但在索引操作的层面上并没有实际的原子性。

于 2020-11-29T04:05:49.963 回答