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

postgresql中二级索引的定义是什么?,postgresql,secondary-indexes,Postgresql,Secondary Indexes,发件人: PostgreSQL中的所有索引都是二级索引,意味着每个索引都与表的主数据区分开存储(在PostgreSQL术语中称为表的堆) 在postgresql中,二级索引是否定义为与表的主数据区分开存储的索引 如果不是,它的定义是什么?为什么引用中提到的不是定义 同样,主索引的定义是什么 postgresql中的概念与中的相同吗 谢谢。二级索引一词似乎没有正式的定义。在引用的文章中,作者想强调索引是与数据表分开存储的(实际上,这是两个文件)。通常,次要索引被理解为主要索引以外的索引。然而,在P

发件人:

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

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

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

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

postgresql中的概念与中的相同吗


谢谢。

二级索引一词似乎没有正式的定义。在引用的文章中,作者想强调索引是与数据表分开存储的(实际上,这是两个文件)。通常,次要索引被理解为主要索引以外的索引。然而,在Postgres中,表的主键也基于与堆分开存储的索引。这些含义是不同的,我认为人们不应该太注意这一点。

主要和次要指数的定义缺乏精确性

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

将其定义为:

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

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

将其定义为:

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

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

对于上述任一定义,某些属性都适用:

  • 主键可以是主索引
  • 每个表最多只能有一个主索引
  • 主索引唯一地确定记录在物理存储器中的保存位置
  • 所有其他指数均归类为次要指数
但是,如果数据文件中记录的位置不是由任何字段决定的,则无法构造主索引

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

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

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

  • Mysql的InnoDB称之为
  • MSSQL还将原始索引称为
  • 甲骨文称之为

Postgres文档中的语言不精确

PostgreSQL中的所有索引都是辅助索引

这是真的

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


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

@klin我认为注释应该是一个答案。除此之外没什么可说的了。这应该可以帮助来自MySQL的人理解其中的区别。在MySQL中,所有索引都不引用表堆,而是引用主键索引。PostgreSQL没有这样的概念。@谢谢。在MySQL中,所有索引都不引用表堆,而是引用主键索引。“所有索引”是否包括“主键索引”?在postgresql中,所有索引都直接引用表堆,对吗?当然MySQL中的主键索引不会引用自身。在PostgreSQL中,所有索引都是相等的,这使读取速度更快,但会减慢修改速度。@LaurenzAlbe您是否有链接指向MySQL中定义了二级索引和一级索引的位置?谢谢。我的问题是要求澄清术语的含义。如果同一术语在不同的地方有不同的含义。所以这对我来说非常重要和有帮助。我完全理解你,文档的作者似乎应该避免模棱两可的概念。谢谢。“主键可以是主索引”。主索引的搜索键必须是主键还是与主键相关?在PostgreSQL和其他DBMS中,答案会有所不同吗