关键字:
索引类型;B-tree;Hash;GiST;SP-GiST;GIN、人大金仓、KingbaseES
概述
Kingbase提供了好几种索引类型,分别是:B-tree,Hash,Gist,SP-Gist和Gin。由于每种索引使用不同的算法,因此每种索引类型都比较适合某些特定的查询类型。缺省时,CREATE INDEX命令将创建B-tree索引,这适合大多数情况。
B-tree索引
1、B-tree索引适合处理那些能够按顺序存储的数据之上的等于和范围查询。特别在一个建立了索引字段中涉及到使用<、<=、=、>=、>等操作符之一进行比较的时候,Kingbase的查询优化器会考虑B-tree索引。当查询条件中使用between和in以及索引列中涉及is null或is not null条件时,B-tree索引会是查询优化器不错的选择。具体是否使用B-tree索引需要根据查询估算代价来判断,如查询的范围非常广泛,或者查询的结果集占据了表中很大一部分,那么数据库可能会选择不使用索引,使用全表扫描来获取数据。
2、默认创建B-tree索引的语法:create index test_index on test_table(id);
查看表上创建的索引:\d+ test_table
指定创建B-tree索引的语法:drop index test_index;
create index test_index on test_table USING btree(id);
\d+ test_table
Hash索引
1、Hash索引只能处理简单的等于比较,当一个索引的列涉及到使用=操作符比较的时候,查询优化器会考虑使用Hash索引。
2、创建Hash索引的语法:create index test_index on test_table USING hash(id);
3、Hash索引操作目前没有记录WAL日志,因此如果数据库崩溃有未写入的改变,可能需要重建Hash索引。此外,对hash索引的改变在初始的基础备份后不是基于流复制或者基于文件复制的,因此随后使用hash的查询会给出错误的回复,因而减少hash索引的使用是不错的选择。
GiST索引
1、GiST索引不是单独一种索引类型,而是一种架构,在这种架构上实现的很多不同的索引策略。因此,可以使用Gist索引的特定操作符类型高度依赖于索引策略(操作符类)。
2、内建的GiST操作符类有:
3、创建Gist索引语句:create index test_index on test_table USING gist(location);
\d+ test_table
如果不是内建GiST操作符类的索引数据类型,将会报错:
create index test_index on test_table USING gist(id);
在创建索引时可以指定操作符类的名称:create index test_index on test_table USING gist(location point_ops);
\d+ test_table
SP-GiST索引
1、SP-Gist索引类似于Gist索引,提供一个支持不同类型检索的架构,允许广泛不同的非平衡基于磁盘的数据结构的实施,例如四叉树,k-d树和根树。这些结构的共同特征是它们反复地将搜索空间划分成大小不需要相等的分区,匹配这些划分规则的搜索会很快。内建的SP-GiST操作符类有:
在用于类型point的两种操作符类中,quad_point_ops是默认值。kd_point_ops支持相同的操作符,但是使用一种不同的索引数据结构,在某些应用中它可以提供更好的性能。
2、创建SP-GiST索引语句:create index test_index on test_table USING spgist(location);
\d+ test_table
如果不是内建SP-GiST操作符类的索引数据类型,将会报错:
create index test_index on test_table USING sp-gist(id);
在创建索引时可以指定操作符类的名称:create index test_index on test_table USING spgist(location kd_point_ops);
\d+ test_table
GIN索引
1、GIN索引是反转索引,它可以处理包含多个键的值(比如数组),与Gist和SP-Gist索引类似,支持用户定义的索引策略,可以使用GIN索引的特定操作符类型根据索引策略的不同而不同。
GIN索引的内建操作符类有:
在两种用于类型jsonb的操作符类中,jsonb_ops是默认项。jsonb_path_ops支持较少的操作符,但是为那些操作符提供了更好的性能。
2、创建GIN索引的语法:CREATE TABLE products(id SERIAL, keywords TEXT[]);
INSERT INTO products (id, keywords) VALUES(1,'{"apple", "fruit"}'),(2,'{"banana", "fruit"}');
CREATE INDEX test_gin_index ON products USING gin(keywords);
\d+ products
如果不是内建GIN操作符类的索引数据类型,将会报错:CREATE INDEX test_gin_index ON products USING gin(id);
在创建索引时可以指定操作符类的名称:CREATE INDEX test_gin_index ON products USING gin(keywords array_ops);
\d+ products
参考资料
kingbaseES V8用户手册