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

我正在读RDMS在某种形式的B树中将表数据存储在磁盘上,并且表索引也以B树形式存储.

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

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

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

谢谢你的澄清

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

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

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

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

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

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

答案很长:

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

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

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

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

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

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

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

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

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

点赞