我了解到,当事务执行更改时,Postgres mvcc方案会存储一个包含更新数据的新行,以及相关的版本。
其他事务知道它们应该看到哪些版本,并选择适当的行。
我还了解到,表的主索引存储行的所有版本。我可以看到如何更新主索引(锁定它以进行写入、追加行和解锁)。我不确定这是否是它的工作方式,但这是一种潜在的方式)。
但是Postgres是如何自动更新二级索引的呢?我设想当一个事务提交时,所有的索引都需要使用行中的新数据进行更新。
Postgres是否获取了所有二级索引的锁以自动更新它们?如果是这样,锁的粒度是在索引级还是在值级(仅锁定特定值的索引部分)?
这种方法在其他数据库引擎中也是一样的吗,比如InnoDB?
我正在构建一个玩具数据库,我很难理解如何有效地更新二级索引。任何关于这个主题的论文都是受欢迎的!
非常感谢!
发布于 2020-11-29 12:05:50
PostgreSQL不支持按索引组织的表。所以所有的索引都是二级索引。
索引不会自动更新。如果一个进程在索引中看到一个有趣的条目,它就会将其追逐到表中。在表中,它看到该元组尚未提交,因此忽略它。系统安排向用户呈现原子性的体验,但在索引操作的级别上并不存在实际的原子性。
https://stackoverflow.com/questions/65053753
复制相似问题