来自https://www.postgresql.org/docs/9.6/static/indexes-index-only-scans.html:
PostgreSQL中的所有索引都是二级索引,意味着每个索引都与表的主数据区分开存储(在PostgreSQL术语中称为表的堆)。
在postgresql中,辅助索引是否定义为与表的主数据区分开存储的索引?
如果没有,它的定义是什么,为什么引号中提到的不是定义?
类似地,主索引的定义是什么?
postgresql中的概念与Oracle database中的概念相同吗?
谢谢。
答案 0 :(得分:3)
主索引和次索引的定义存在一些不足。
使用两种流行的大学教材作为参考:
Fundamentals of Database Systems, Elmasri & Navathe将它们定义为:
主索引作为有序文件上的索引,其中搜索键与排序键相同
辅助索引提供了一种辅助方法,用于访问已存在某些主访问权限的数据文件。数据文件记录可以有序,无序或散列。
Database Systems: The Complete Book, Garcia-Molina et. al将它们定义为:
主索引确定数据文件记录的位置
辅助索引与主索引的区别在于,辅助索引不能确定数据文件中记录的位置。相反,二级索引告诉我们记录的当前位置。该位置可能是由其他字段上的主索引决定的
某些属性对以上两个定义均成立:
但是,如果记录在数据文件中的位置不是由任何字段确定的,则不能构造主索引。
因此,对于已排序的文件,谈论主索引(这将是排序所基于的字段列表)很有意义。我找不到其他可以构造主索引的物理文件结构示例。
Postgresql将堆结构用于记录的物理存储。堆没有排序(双关语:它们是排序的)。因此,即使是主键也是使用辅助索引实现的,因此Postgresql中的所有索引都是辅助索引。
其他RDBMS系统做实现支持主索引的存储格式:
Postgres文档中的语言不准确。
PostgreSQL中的所有索引都是二级索引
这是真的。
表示每个索引与表的主数据区分开存储
这不是为什么所有索引在Postgresql中都是次要的。主索引也可以与表的主数据区分开存储。
答案 1 :(得分:1)
似乎二级索引没有正式定义。在引用的段落中,作者想强调指出,索引是与数据表分开存储的(实际上,这是两个文件)。通常,次要索引应理解为主要索引以外的其他索引。但是,在Postgres中,表的主键也基于与堆分开存储的索引。这些含义是不同的,我认为不应对此太在意。