我了解当事务执行更改时,Postgres mvcc 方案会存储一个包含更新数据的新行以及相关版本。
其他事务知道他们应该看到哪些版本,并选择适当的行。
我也知道表的主索引存储了行的所有版本。我可以看到如何更新主索引(您将其锁定以进行写入,追加行并解锁。我不确定这是否是它的工作方式,但这是一种潜在的方式)。
但是 Postgres 是如何自动更新二级索引的呢?我想当事务提交时,所有索引都需要使用行中的新数据进行更新。
Postgres 是否会锁定所有二级索引以自动更新它们?如果是这样,锁定的粒度是在索引级别还是在值级别(仅锁定特定值的索引部分)?
其他数据库引擎(如 InnoDB)中的方法是否相同?
我正在构建一个玩具数据库,我很难理解如何有效地更新二级索引。也欢迎任何有关该主题的论文!
非常感谢!