索引-索引方式、类型,系统表、操作函数

1. 索引概念:

  索引是指按表中某些关键属性或表达式建立元组的逻辑顺序,它是由一系列表元组的标识号组成的列表

2. PostgrSql的5中索引方式,四种索引类型:

  • 索引方式:唯一索引、主键索引、多属性索引、部分索引、表达式索引
  • 索引类型:B-Tree、Hash、GiST、GIN。

2.1 索引方式:

2.1.1 唯一索引:

  不允许出现多个索引值相同的元组,目前只有B-Tree可以创建唯一索引

2.1.2 主键索引:

  表上定义了主键,postgresql会自动在主键属性上创建唯一索引,主键索引是唯一索引的特殊类型

2.1.3 多属性索引:

  索引定义在多个属性上,成为多属性索引。B-Tree、GiST和GIN支持多属性索引,最多可在32个属性上创建索引

  多属性索引不仅可以使用表中的属性,也可以使用函数或表达式计算得到的值

2.1.4 部分索引:

  建立在一个表的子集上的索引。子集由一个表达式定义,如:

  CREATE INDEX stu_name_idx ON student(name) WHERE (id > 1 AND id<255)

  给student表中的id在1到255之间元组的name属性建立索引

2.1.5 表达式索引:

  属性并非一定建立在一个表的属性上,还可以建立在一个函数或者从表中一个或多个属性计算出来的标量表达式上。如给name属性的小写函数值建立索引:

  CREATE INDEX stu_name_idx ON student(lower(name) )

 

2.2 属性类型:

2.2.1 B-Tree

  使用类似于B+树的结构来存储数据的键值。适合比较查询和范围查询(>、=、<)

2.2.2 Hash

  使用Hash函数对索引关键字进行散列。适合等于比较(=)

2.2.3 GiST(Generalized Search Tree)

  通用搜索树。严格来说,GiST索引不是一种独立的索引类型,而是一种架构或者索引模板,可以在这种架构(模板)上实现不同的索引策略。使用此索引的操作符高度依赖于索引策略

2.2.4 GIN(Generalized Inverted Index)

  倒排索引。和GiST类似,GIN支持用户定义的索引策略,对于不同索引策略,可以使用的操作符不同。可处理多个键的值(如数组)

3. 索引的相关系统表

  • 索引相关的系统表记录和管理索引的相关信息

3.1 pg-am

  每种索引类型都在pg-am表里面用一个元组来记录,每一个元组记录该索引类型提供的访问函数,以及一些特性,如是否支持多属性索引等。

  目前有4个元组,分别对应B-Tree、Hash、Gist、GIN索引

  •  访问函数引用自包存函数信息的系统表:pg_proc

3.2 pg_class、pg_index

  每创建一个索引,都会在pg_class、pg_index系统表中添加一个元组。pg_index记录与索引有关的信息

  •  indexrelid: pg_class里的OID
  • indkey:为一个数组,记录这个索引是在那些属性上建立的

3.3 pg_opclass

  操作符类系统表。记录索引类型操作特定数据类型时需要使用的操作集合。一个元组记录的是一个索引类型在操作一种数据类型时需要使用的操作集合

  同一个索引类型和数据类型,可以定义多个操作符类。如对于B-Tree索引,需要对数据进行排序,对于复数类型,可定义对复数绝对值进行排序的操作符类,也可定义根据复数实部排序的操作符类

  

  •  opcfamily:引用自pg_opfamily, pg_opfamily表每个元组定义一个操作符集合。这个字段表明该操作符类对应的操作符集合

3.4 pg_opfamily、pg_operator、pg_amop

  • pg_opfamily: 操作符集合表,每个元组定义一个操作符集合
  • pg_operator:操作符表
  • pg_amop:操作符集合表和操作符表的对应关系表

  

 3.5 pg_amproc

  是操作符集合(pg_opfamily)与函数(pg_proc)的对应关系表。如果一个函数属于一个操作符集合,则在此表中有一个元组来记录

4 索引的操作函数

  • 每一种索引类型都在pg_am(看上面3中的系统表)注册了操作函数,不同索引类型操作函数数目不相同,最多可以有13个操作函数。
  • 索引通过实现不同的操作函数来实现自身的功能

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个接口函数一一对应。上层函数调用下层函数,并做一些额外工作来完成函数的功能

 

posted @ 2021-04-18 22:41  foreast  阅读(1730)  评论(0编辑  收藏  举报