繁体   English   中英

数据库如何修改磁盘上的索引?

[英]How databases modify indexes on disk?

根据文档,每个PostgreSQL表都存储在一个单独的文件中。 当表超过1 GB时,它将被分成千兆字节大小的段。 (其他rdbms或多或少也是如此)

假设我要更新位于文件中间的行。 在不丢失第二部分的情况下,无法在文件中间进行写入。 如果将文件分为两部分,请写入一些数据,文件的第二部分应复制到某个位置(在内存中或另一个文件中),然后附加到文件的第一部分。 在这种情况下,内部会使用什么rdbms?

也许不是修改整个文件,而是将具有新版本的修改行添加到文件中,并使旧记录保持不变。 如果是真的,我对索引也有同样的疑问。 如果发生b树插入,必须在文件的任意位置修改索引文件。 rdbms是否在每次更新/插入时重写整个索引文件?

这个评论太长了。

您对段大小的注视被错误地放置了。 在整个数据库中,使用“段”来分解单个文件并不是很常见。 将数据存储在分配给一个或多个文件的表空间中的一种替代机制也很常见,其中一个物理文件存储来自多个表的页面。 并且还有其他选择(考虑列式数据存储)。 那是Postgres或任何其他数据库中存储机制中最不重要的部分。

通常,关系数据库在页面上存储表。 文档中介绍了Postgres的页面布局。 最重要的是,这些是固定大小的块,包含行(或行的一部分)。

当在查询中引用页面时,它们一次被读入内存“ 1”中-引号中的“ 1”是因为相邻页面通常作为块读入。 这些页面在内存缓存中进行管理,而查询则需要这些页面,有时会根据需要换出或写入磁盘。

页面中可以有空白空间。 细分可以有空白页。 当您插入记录时,它可能位于最后一页的末尾或较早的页面,这取决于有多少空间和其他注意事项。

索引也组织在页面上-实际上,使用相同的页面布局(尽管术语略有不同)。 在索引中插入行的机制可能涉及创建新页面(“页面拆分”)或仅在现有页面上插入行。

这是一个高级描述。 Postgres是一个非常开放的数据库,其中详细记录了这些细节。 其他数据库也做类似的事情,尽管每个数据库的细节确实有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM