4

我正在阅读 RDMS 以某种形式将表数据存储在磁盘上B-tree,并且表索引存储在B-tree形式中。

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

这不是浪费资源吗?为什么不通过主键索引来保存所有表?

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

感谢您的澄清

4

1 回答 1

3

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

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

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

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

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

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

长答案:

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

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

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

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

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

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

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

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

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

于 2012-09-17T09:34:02.597 回答