2

来自https://www.postgresql.org/docs/9.6/static/indexes-index-only-scans.html

PostgreSQL 中的所有索引都是二级索引,这意味着每个索引都与表的主数据区(在 PostgreSQL 术语中称为表的堆)分开存储。

在 postgresql 中,二级索引是否定义为与表的主数据区分开存储的索引?

如果不是,它的定义是什么,为什么引用提到的不是定义?

同样,主索引的定义是什么?

postgresql 中的概念与Oracle 数据库中的概念相同吗?

谢谢。

4

2 回答 2

7

主要和次要指标的定义有些缺乏精确性。

使用两本流行的大学课本作为参考:

数据库系统基础,Elmasri 和 Navathe将它们定义为:

主索引作为有序文件的索引,其中搜索键与排序键相同

二级索引提供了访问已经存在一些主要访问权限的数据文件的辅助方法。数据文件记录可以是有序的、无序的或散列的。

数据库系统:全书,Garcia-Molina 等。al将它们定义为:

主索引确定数据文件记录的位置

二级索引与主索引的区别在于二级索引不确定记录在数据文件中的位置。相反,二级索引告诉我们记录的当前位置;该位置可能是由某个其他字段上的主索引决定的

一些适用于上述任一定义的属性:

  • 主键可以是主索引
  • 每个表最多可以有 1 个主索引
  • 主索引唯一地确定记录在物理存储中的保存位置。
  • 所有其他指数都归类为次要指数。

但是,如果数据文件中记录的位置不是由任何字段决定的,则无法构建主索引。

因此,对于已排序的文件,谈论主索引(这将是排序所基于的字段列表)是有意义的。我找不到可以构建主索引的物理文件结构的其他示例。

Postgresql 利用堆结构来物理存储记录。堆没有排序(双关语警告:它们是排序的)。因此,即使是主键也是使用二级索引实现的,因此 Postgresql 中的所有索引都是二级索引。

其他 RDBMS 系统确实实现了支持主索引的存储格式:


Postgres 文档中的语言不精确。

PostgreSQL 中的所有索引都是二级索引

这是真实的。

这意味着每个索引都与表的主数据区分开存储

这不是为什么所有索引在 Postgresql 中都是次要的。主索引也可以与表的主数据区分开存储。

于 2018-06-28T16:43:30.913 回答
1

二级索引这个词似乎没有正式的定义。在引用的段落中,作者想强调的是,索引与数据表分开存储(物理上,这是两个文件)。通常二级索引被理解为主索引以外的索引。但是,在 Postgres 中,表的主键也是基于与堆分开存储的索引。这些含义是不同的,我认为不应过分关注这一点。

于 2018-06-28T13:58:39.067 回答