【问题标题】:What is the definition of secondary index in postgresql?postgresql中二级索引的定义是什么?
【发布时间】:2018-12-07 14:16:41
【问题描述】:

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

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

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

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

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

postgresql 中的概念和Oracle database 中的概念一样吗?

谢谢。

【问题讨论】:

  • @klin 我认为该评论应该是一个答案。没什么好说的了。
  • 这应该是为了帮助那些来自 MySQL 的人理解其中的区别。在 MySQL 中,所有索引都不是引用表堆,而是主键索引。 PostgreSQL没有这样的概念。
  • @LaurenzAlbe 谢谢。 “在 MySQL 中,所有索引都不是引用表堆,而是主键索引。” “所有索引”是否包括“主键索引”?在postgresql中,所有索引是否都直接引用表堆,对吗?
  • 当然MySQL中的主键索引不引用自己。在 PostgreSQL 中,所有索引都是相等的,这使得读取速度更快,但会减慢修改速度。
  • @LaurenzAlbe 你有链接到 MySQL 中定义二级索引和主索引的位置吗?

标签: postgresql secondary-indexes


【解决方案1】:

主要和次要指标的定义有些不精确。

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

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

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

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

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

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

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

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

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

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

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

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

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


Postgres 文档中的语言不准确。

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

这是真的。

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

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

【讨论】:

  • 谢谢。 “主键可以是主索引”。主索引的搜索键必须是主键或与主键相关吗? PostgreSQL 和其他 DBMS 中的答案会有所不同吗
【解决方案2】:

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

【讨论】:

  • 谢谢。我的问题是要求澄清术语的含义。如果同一个词在不同的地方有不同的含义。所以这对我来说非常重要和有帮助。
  • 我完全理解你,看来文档的作者应该避免模棱两可的概念。
猜你喜欢
  • 1970-01-01
  • 2018-11-08
  • 2019-10-08
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2019-01-27
  • 1970-01-01
相关资源
最近更新 更多