postgresql中二级索引的定义是什么?

时间:2018-06-28 13:14:45

标签: postgresql secondary-indexes

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

  

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

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

如果没有,它的定义是什么,为什么引号中提到的不是定义?

类似地,主索引的定义是什么?

postgresql中的概念与Oracle database中的概念相同吗?

谢谢。

2 个答案:

答案 0 :(得分:3)

主索引和次索引的定义存在一些不足。

使用两种流行的大学教材作为参考:

Fundamentals of Database Systems, Elmasri & Navathe将它们定义为:

  

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

     

辅助索引提供了一种辅助方法,用于访问已存在某些主访问权限的数据文件。数据文件记录可以有序,无序或散列。

Database Systems: The Complete Book, Garcia-Molina et. al将它们定义为:

  

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

     

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

某些属性对以上两个定义均成立:

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

但是,如果记录在数据文件中的位置不是由任何字段确定的,则不能构造主索引。

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

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

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


Postgres文档中的语言不准确。

  

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

这是真的。

  

表示每个索引与表的主数据区分开存储

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

答案 1 :(得分:1)

似乎二级索引没有正式定义。在引用的段落中,作者想强调指出,索引是与数据表分开存储的(实际上,这是两个文件)。通常,次要索引应理解为主要索引以外的其他索引。但是,在Postgres中,表的主键也基于与堆分开存储的索引。这些含义是不同的,我认为不应对此太在意。