索引是指按表中某些关键属性或表达式建立元组的逻辑顺序,它是由一系列表元组的标识号组成的列表
不允许出现多个索引值相同的元组,目前只有B-Tree可以创建唯一索引
表上定义了主键,postgresql会自动在主键属性上创建唯一索引,主键索引是唯一索引的特殊类型
索引定义在多个属性上,成为多属性索引。B-Tree、GiST和GIN支持多属性索引,最多可在32个属性上创建索引
多属性索引不仅可以使用表中的属性,也可以使用函数或表达式计算得到的值
建立在一个表的子集上的索引。子集由一个表达式定义,如:
CREATE INDEX stu_name_idx ON student(name) WHERE (id > 1 AND id<255)
给student表中的id在1到255之间元组的name属性建立索引
属性并非一定建立在一个表的属性上,还可以建立在一个函数或者从表中一个或多个属性计算出来的标量表达式上。如给name属性的小写函数值建立索引:
CREATE INDEX stu_name_idx ON student(lower(name) )
使用类似于B+树的结构来存储数据的键值。适合比较查询和范围查询(>、=、<)
使用Hash函数对索引关键字进行散列。适合等于比较(=)
通用搜索树。严格来说,GiST索引不是一种独立的索引类型,而是一种架构或者索引模板,可以在这种架构(模板)上实现不同的索引策略。使用此索引的操作符高度依赖于索引策略
倒排索引。和GiST类似,GIN支持用户定义的索引策略,对于不同索引策略,可以使用的操作符不同。可处理多个键的值(如数组)
每种索引类型都在pg-am表里面用一个元组来记录,每一个元组记录该索引类型提供的访问函数,以及一些特性,如是否支持多属性索引等。
目前有4个元组,分别对应B-Tree、Hash、Gist、GIN索引
每创建一个索引,都会在pg_class、pg_index系统表中添加一个元组。pg_index记录与索引有关的信息
操作符类系统表。记录索引类型操作特定数据类型时需要使用的操作集合。一个元组记录的是一个索引类型在操作一种数据类型时需要使用的操作集合
同一个索引类型和数据类型,可以定义多个操作符类。如对于B-Tree索引,需要对数据进行排序,对于复数类型,可定义对复数绝对值进行排序的操作符类,也可定义根据复数实部排序的操作符类
是操作符集合(pg_opfamily)与函数(pg_proc)的对应关系表。如果一个函数属于一个操作符集合,则在此表中有一个元组来记录
1) ambuild
创建一个新索引。生成索引元组并将它们填充到索引文件中
2)aminsert
插入一个新的索引元组
3)ambulkdelete
删除索引元组
4)amvacuumcleanup
在一个VACUUM操作(一个或多个ambulkdelete调用)之后调用,主要完成额外的清理工作。通常用在批量删除中
5)amcostestimate
估算一个索引扫描的代价。存在的目的是允许索引访问方法提供与索引类型相关的信息
6)amoptions
分析和验证一个索引的reloptions数组(pg_class表)。reloptions数组中是pg_class表中的元素,元素为一个个的键值对,定义了特定的选项,如pg_class中某个B-Tree索引的reloptions数组中定义了fillfactor=80,这个函数就可以分析出这个索引的填充因子为80
7)ambeginscan
开始一个新的扫描。主要是构造索引扫描描述符结构IndexScanDescData。IndexScanDescData结构是索引通用的扫描描述符,记录索引进行扫描过程中的状态信息
8)amgettuple
获取下一个元组
9)amgetbitmap
获取所有可用的元组
10)amrescan
重启一个扫描
11)amendscan
结束扫描并释放资源
12)ammarkpos
标记当前扫描位置
13)amrestrpos
把扫描恢复到最近标记的位置
为了给上层函数提供一个使用索引的统一接口,postgresql在indexam.c和index.c文件中提供了一套用于操作索引的函数,这些函数和上面介绍的13个接口函数一一对应。上层函数调用下层函数,并做一些额外工作来完成函数的功能
原文:https://www.cnblogs.com/liuxuelin/p/14674962.html