PG内核分析 Q&A (10)

索引从本质上来说就是一些数据的键值与元组标识符(TID, Tuple OID)之间的映射,
这些标识符确定了该索引键值在表中对应的元组.

4.1.1 索引方式 PG中共有几种索引方式, 分别介绍

PG中共有5种索引方式, 即唯一索引,主键索引,多属性索引,部分索引和表达式索引.

唯一索引

如果索引声明为唯一索引,
那么就不允许出现多个索引值相同的元组.唯一索引可以用于强迫索引属性数值的唯一性,或者是多个属性组合值的唯一性,唯一索引通过在创建索引命令中加上UNIQUE关键字来创建.
一个多字段唯一索引认为只有两个元组的所有被索引属性都相同的时候才是相同的,
这种重复元组才被拒绝.

目前只有B-Tree可以创建唯一索引.

主键索引

如果一个表上定义了一个主键,
那么PG会自动在主键属性上创建唯一索引来实现主键约束.可以说,主键索引中唯一索引的特殊类型.

多属性索引

如果一个索引定义在多于一个的属性上,就称其为多属性索引,它多用于组合查询.

目前, PG中的B-Tree, GiST和GIN支持多属性索引, 最多可在32个属性上创建索引.

虽然PG提供了多属性索引功能, 但大多数情况下在单个属性上的索引就足够了.

除非表的查询模式非常固定, 否则超过单个属性的索引几乎没有太多用处.

当对一个表创建我属性索引时,
对于表中的一个元组,会依次读取出该元组被索引属性的值,使用这些值一起作为该元组的索引键值.

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

部分索引

建立在一个表上的索引, 该子集由一个条件表达式定义(表达式即部分索引的谓词),
该索引只包含表中那些满足这个谓词的元组.

下面的语句在student表中,
对id在”1”到”255”中的元组name属性创建索引,这种索引就是部分索引.

create index stu_name_idx on student(name) where (id > 1 and i < 255)

表达式索引 *

索引并非一定要建立在一个表的属性上,还可以建立在一个函数或者从中一个或多个属性计算出来的标量表达式上.

例如, 可以在student表的name字段上通过小写函数来创建表达式索引并进行查询.

创建: create index stu_low_name_idx on student(lower(name));

查找: select * from student where lower(name) = ‘jack’;

4.1.2 索引类型 PG中有几种索引类型, 分别介绍

PG8.4.1中共有4各索引类型, 下面分别简单介绍一下.

B-Tree

B-Tree索引使用一种类似于B+树的结构来存储数据键值,通过这种结构能够快速地查找索引.B-Tree索引适合支持比较查询以及范围查询.在一个建立了B-Tree索引的属性涉及使用操作符(>,
=, <操作符)进行比较的时候, PG的查询优化器会考虑使用B-Tree索引进行查找.

Hash

Hash索引使用Hash函数对索引的关键字进行散列.

Hash索引只能处理简单的等于比较.当一个建立了Hash索引的属性涉及使用”=”操作符进行比较的时候,查询优化器会考虑使用Hash索引.

GiST

GiST(Generalized Search Tree)意为通用搜索.严格来说,
GiST索引不是一种独立的索引类型,而是一种架构或者索引模板,可以在这种架构(模板)上实现不同的索引策略.

因此, 可以使用GiST索引的操作符类型高度依赖于索引策略(操作符类).

在以前版本的PG中还有R-Tree索引, 但后来随着GiST的出现,
取消了R-Tree索引,因为使用GiST索引的架构可以很容易地实现r-tree索引.

GIN

GIN(Generalized Inverted Index)索引是倒排索引,
它可以处理包含多个键的值(比如数组). 与GiST类似, GIN支持用户定义的索引策略,
对于不同的索引策略, 可以使用的操作符也是不同的.

在后面介绍的Tsearch2全文搜索,
既可以通过GiST来实现,也可以通过GIN实现,两种各有特点.

4.1.3 索引相关系统表 索引相关的系统表有哪些

为了管理各种索引类型, PG定义了相关系统表, 这些系统表记录了索引相关的信息.

每种索引类型都在系统表pg_am(access method)里面用一个元组来记录.

pg_am表中的每一个元组包括了该索引类型提供的访问函数,这些函数是引用自pg_proc系统表中注册的函数(该系统表存储了关于函数的信息,
每一个元组表示一个函数),

另外,pg_am中的元组还记录了索引类型的一些特征,比如它是否支持多属性索引等.

PG内核分析 Q&A

4.1.4 索引的操作函数

TODO

4.2 B-Tree索引 4.2.1 B-Tree索引的组织结构

TODO

4.2.2 B-Tree索引的操作

TODO

4.3 Hash索引 4..3.1 Hash索引的组织结构

TODO

4.4 GiST索引 4.4.1 GiST的扩展性

TODO

4.4.2 GiST索引的组织结构

TODO

4.4.3 GiST索引的实现

TODO

4.4.4 GiST索引实例

TODO

4.5 GIN索引 4.5.1 GIN索引的扩展性

TODO

4.5.2 GIN索引的组织结构

TODO

4.5.3 GIN索引的操作

TODO

4.6 TSearch2全文搜索 4.6.1 全文搜索的创建

TODO

4.6.2 全文搜索的查询

TODO

4.6.3 查询结果的处理

TODO

4.7 小结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysxsx.html