gpt4 book ai didi

database - 为什么主键索引是一个附加结构?

转载 作者:太空狗 更新时间:2023-10-30 01:57:19 27 4
gpt4 key购买 nike

我读到 RDMS 以某种形式的 B 树 将表数据存储在磁盘上,而且表索引以 B 树 形式存储。

我读到 primary key 索引是为定义的 primary key 自动创建的,但它也可以随时删除。因此,这意味着 primary-key 索引是仅用于存储表数据的 B 树旁边的附加结构。

那不是浪费资源吗,为什么不把所有的表表都通过主键索引保存呢?

如果不是这样,那么用于存储表数据的B-tree使用什么顺序?

感谢澄清

最佳答案

主键索引是一种优化,用于查找磁盘上保存行的位置。作为一个结构,它只包含 PK 数据,而不是整行。

在数据库上,性能通常取决于从磁盘和缓存中读取的页数。由于PK索引比整表小,在缓存中的可能性更大,导致从磁盘读取的 block 更少,其他表从缓存中移除的 block 也更少。因此,这是一项重大的性能优化。

此外,在修改表数据时,行被锁定。如果从磁盘上的表数据扫描主键,锁定的行会减慢所有其他查询的访问速度。通过将索引分离为单独的结构,即使在指向的行被锁定时也可以使用索引。

总的来说,单独的 PK 结构是经典的空间换时间优化。

编辑 表中行的顺序是什么?以下答案适用于 Oracle,但适用于许多数据库。

简短回答:行在磁盘上没有排序,这就是 PK 索引(和其他索引)如此重要的原因。

长答案:

虽然主键 b 树结构必须排序(b 树),但表的行分散在表空间中。要理解这一点,我们需要深入了解各种数据结构。

首先,数据库被构造成称为表空间的逻辑实体。表空间是一个或多个磁盘上一个或多个文件的空间。文件开始是空的。当表空间变满时(从技术上讲,当其中的数据达到阈值时)表空间可以自动增长。它也可以通过放大文件(添加“范围”或添加新文件)来手动增长。表空间可以集群到多台机器和磁盘上。

第二:一个表空间被划分成段,每个段供单个表或索引使用。

第三:段被分成 block ,每个 block 有一个或多个行的空间。这些 block 与磁盘或操作系统 block 相同; Oracle block 是一个或多个操作系统 block 。 (这是为了可传输性,以及管理具有不同 block 大小的媒体)。

在插入时,数据库将从表空间的任何位置选择一个 block 中的空间。行可以按顺序插入(尤其是批量插入到空表中),但通常数据库也会重用由于某些类型的更新而删除或移动行的空间。虽然从理论上讲放置是一种可预测的,但在实践中,您永远不应依赖或期望将行放置在任何特定 block 中。

Oracle 中的一件有趣的事情是 ROWID。这是存储在索引中的引用,允许数据库查找行:

  • 一个扩展的 rowid 有一个四部分的格式,OOOOOOFFFBBBBBBRRR:
  • 前6个字符OOOOOO代表数据对象编号,使用32bits
  • 接下来的3个字符FFF代表表空间相关的数据文件号,使用10bits。
  • 接下来的6个字符BBBBB代表区 block 号,使用22bits。
  • 最后3个字符RRR代表行号,使用16bit

有关更多详细信息,请参阅 http://docs.oracle.com/cd/E11882_01/server.112/e25789/logical.htm#autoId0

另一个想法:DB 世界中有一个概念叫做 partitions ,其中数据集根据某些表达式逻辑划分到不同的表空间(通常是集群中的不同磁盘或节点)。例如,在客户表上,垂直分区可以按人员所在的国家/地区定义。这样您就可以确保美国客户实际在一个磁盘上,而澳大利亚客户在另一个磁盘上。

关于database - 为什么主键索引是一个附加结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12456243/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com