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