GBase 8c包含5种索引方式:唯一索引、主键索引、多属性索引、部分索引、表达式索引。其中:
(1)唯一索引:字面上理解就是在索引上增加唯一约束,不允许出现索引值相同的行,目前只有B-tree索引可以声明唯一索引,唯一键会自动创建唯一索引。
CREATE UNIQUE INDEX name ON table (column [, ...]);
唯一索引通过在创建索引命令加上UNIQUE关键字来创建。一个多字段唯一索引认为只有两个元组的所有被索引属性都相同的时候才是相同的,这种重复元组才被拒绝。
- 主键索引:如果一个表上定义了一个主键,那么GBase 8c会自动在主键属性上创建唯一索引来实现主键约束。可以说,主键索引是唯一索引的特殊类型。
- 多属性索引:如果一个索引定义在多余一个的属性上,就称其为多属性索引,它多用于组合查询。目前GBase 8c中的B-Tree、GiST和GIN支持多属性索引,最多可在32个属性上创建索引。
大多数情况下,在单个属性上的索引就足够了,除非表的查询模式非常固定,否则超过三个属性的索引几乎没太多用处。当对一个表创建多属性索引时,对于表中的一个元组,会依次去读取该元组被索引属性的值,使用这些值一起作为该元组的索引键值。多属性索引中不仅可以使用表中的属性,也可以是使用函数或表达式计算得到的值。
- 部分索引:建立在一个表的子集上的索引,该子集由一个条件表达式定义(表达式即部分索引的谓词),该索引只包含表中那些满足这个谓词的元组。
CREATE INDEX stu_name_idx ON student(name) WHERE (id > 1 AND id < 255 );
上面的语句在student表中,对id在“1”到“255”中的元组的name属性创建索引,这种索引就是部分索引。使用部分索引,能减少索引的规模,提高索引的查询效率。
- 表达式索引:索引并非一定要建立在一个表的属性上,还可以建立在一个函数或者从表中一个或多个属性计算出来的标量表达式上。例如,可以在student表的name字段上通过小写函数来创建表达式索引并进行查询:
CREATE INDEX stu_low_name_idx ON student(lower(name));---创建
SELECT * FROM student WHERE lower(nmae) = ‘jack’;---查找
表达式索引只有在查询时使用与创建时相同的表达式才会起作用。与部分索引类似,表达式索引的表达式是保存在pg_index系统表的indexprs属性中。在创建索引的过程中,会根据表达式计算出实际索引的键值,这会导致插入或更新元组时效率变慢。(在更新索引时会使用表达式进行重新计算)。