为什么主键索引是一个额外的结构?

时间:2012-09-17 09:13:55

标签: database data-structures indexing primary-key b-tree

我读到RDMS以某种形式 B-tree 将表数据存储在磁盘上,并且表索引也存储在 B-tree 表单中。< / p>

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

不是浪费资源 - 为什么不能通过主键索引保留所有表格?

如果不是这样,那么哪个订单用于存储表数据的 B-tree

感谢您澄清

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

简短回答:磁盘上没有订购行,这就是PK索引(和其他索引)非常重要的原因。

答案很长:

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

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

第二:表空间是分段,每个段用于使用单个表或索引。

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

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

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

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

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

另一个想法:在DB世界中有一个名为partitions的概念,其中数据集根据某些表达式逻辑划分在不同的表空间(通常是不同的磁盘或集群中的节点)中。例如,在客户表上,可以根据人的国家来定义垂直分区。通过这种方式,您可以确保美国客户身在一个磁盘上,而澳大利亚人则在另一个磁盘上。