postgresql索引类型

索引查看

SELECT  

A.SCHEMANAME,  

A.TABLENAME,  

A.INDEXNAME,  

A.TABLESPACE,  

A.INDEXDEF,  

B.AMNAME,  

C.INDEXRELID,  

C.INDNATTS,  

C.INDISUNIQUE,  

C.INDISPRIMARY,  

C.INDISCLUSTERED,  

D.DESCRIPTION  

FROM  

PG_AM B  

LEFT JOIN PG_CLASS F ON B.OID = F.RELAM  

LEFT JOIN PG_STAT_ALL_INDEXES E ON F.OID = E.INDEXRELID  

LEFT JOIN PG_INDEX C ON E.INDEXRELID = C.INDEXRELID  

LEFT OUTER JOIN PG_DESCRIPTION D ON C.INDEXRELID = D.OBJOID,  

PG_INDEXES A  

WHERE  

A.SCHEMANAME = E.SCHEMANAME AND A.TABLENAME = E.RELNAME AND A.INDEXNAME = E.INDEXRELNAME  

AND E.SCHEMANAME = 'public' AND E.RELNAME = 'obj4' ;

索引类型及应用

1、btree

应用场景
b-tree适合所有的数据类型,支持排序,支持大于、小于、等于、大于或等于、小于或等于的搜索。
索引与递归查询结合,还能实现快速的稀疏检索。

2、hash

应用场景
hash索引存储的是被索引字段VALUE的哈希值,只支持等值查询。

hash索引特别适用于字段VALUE非常长(不适合b-tree索引,因为b-tree一个PAGE至少要存储3个ENTRY,所以不支持特别长的VALUE)的场景,例如很长的字符串,并且用户只需要等值搜索,建议使用hash index。

3、gin 

原理

gin是倒排索引,存储被索引字段的VALUE或VALUE的元素,以及行号的list或tree。

应用场景
1、当需要搜索多值类型内的VALUE时,适合多值类型,例如数组、全文检索、TOKEN。(根据不同的类型,支持相交、包含、大于、在左边、在右边等搜索)

2、当用户的数据比较稀疏时,如果要搜索某个VALUE的值,可以适应btree_gin支持普通btree支持的类型。(支持btree的操作符)

3、当用户需要按任意列进行搜索时,gin支持多列展开单独建立索引域,同时支持内部多域索引的bitmapAnd, bitmapOr合并,快速的返回按任意列搜索请求的数据。

create table t_gin1 (id int, arr int[]); 

do language plpgsql $$
declare
begin
for i in 1..10000 loop
insert into t_gin1 select i, array(select random()*1000 from generate_series(1,10));
end loop;
end;
$$;
select * from t_gin1 limit 30;
create index idx_t_gin1_1 on t_gin1 using gin (arr);
select * from t_gin1 where arr && array[1,999];

  

4、gist

应用场景

GiST是一个通用的索引接口,可以使用GiST实现b-tree, r-tree等索引结构。

不同的类型,支持的索引检索也各不一样。例如:

1、几何类型,支持位置搜索(包含、相交、在上下左右等),按距离排序。

2、范围类型,支持位置搜索(包含、相交、在左右等)。

3、IP类型,支持位置搜索(包含、相交、在左右等)。

4、空间类型(PostGIS),支持位置搜索(包含、相交、在上下左右等),按距离排序。

5、标量类型,支持按距离排序。

5、sp-gist

SP-GiST类似GiST,是一个通用的索引接口,但是SP-GIST使用了空间分区的方法,使得SP-GiST可以更好的支持非平衡数据结构,例如quad-trees, k-d tree, radis tree.

应用场景

1、几何类型,支持位置搜索(包含、相交、在上下左右等),按距离排序。

2、范围类型,支持位置搜索(包含、相交、在左右等)。

3、IP类型,支持位置搜索(包含、相交、在左右等)。

6、brin

7、rum

8、bloom

9、zombodb

原理

zombodb是PostgreSQL与ElasticSearch结合的一个索引接口,可以直接读写ES。

https://github.com/zombodb/zombodb

应用场景

与ES结合,实现SQL接口的搜索引擎,实现数据的透明搜索。

10、bitmap 

原理

bitmap索引是Greenplum的索引接口,类似GIN倒排,只是bitmap的KEY是列的值,VALUE是BIT(每个BIT对应一行),而不是行号list或tree。

应用场景

当某个字段的唯一值个数在100到10万之间(超出这个范围,不建议使用bitmap)时,如果表的记录数特别多,而且变更不频繁(或者是AO表),那么很适合BITMAP索引,bitmap索引可以实现快速的多个或单个VALUE的搜索。因为只需要对行号的BITMAP进行BIT与或运算,得到最终的BITMAP,从最终的BITMAP映射到行进行提取。

bitmap与btree一样,都支持 等于,大于,小于,大于等于,小于等于的查询。

原文地址:https://www.cnblogs.com/lilei2blog/p/8649234.html