操作符、操作符类和操作符族是索引功能的重要组成部分。定义一个索引的时候,可以为索引中的每一列指定一个操作符类:
CREATE INDEX idxname ON table (id1 opclass [sort options][,...]);
如果不指定则使用默认的操作符类。如果使用自定义类型创建索引,并且针对该数据类型不创建操作符类的话,该索引就无法使用。
操作符类如何让一个索引生效呢?
1、操作符
针对每种数据类型,有比较操作符>、>=、<、<=、=等;算数操作符:加减乘除等;逻辑操作符:AND、OR、NOT等。可以从pg_operator系统表查看操作符的元数据信息。
2、操作符类
对于一个具体的数据类型,如果要能够正常使用索引,除了需要有对应的比较操作符外,还需要操作符类等信息。每个索引都需要对每种数据类型定义一个操作符类,指定在索引中使用的操作符的集合。比如一个int4类型的操作符>、>=、<、<=、=等集合(btree的操作符类必须提供这五种比较操作符)。
在pg_opclass系统表存储操作符类的元数据信息:
一个操作符类定义了用于某个索引访问方法的一种特定数据类型的一组操作:>、>=等,可以用在一个索引的WHERE clause操作符的集合,所以叫做操作符类。
可以为一个数据类型的同一个索引定义多个操作符类,最常用的一个被标记为默认操作符类,作为整个类型在一个索引访问方法下的默认选择。当然也可以创建索引时显式指定使用哪个。
索引访问方法的strategy和support function的关系是:操作符类中的操作符对应表访问方法的具体策略,操作符的函数对应表访问方法的support function。比如btree索引有5个策略:
Btree访问方法定义了3类支持函数:
1)比较两个key,并且返回小于0的整数、0、大于0的整数,分别表示第一个key<第2个key、等于和大于第2个key
2)返回C-callable sort support functions的地址(可选)
3)将测试值与基准值加/减偏移量后的值进行比较,并根据比较结果返回false或者true