1. 程式人生 > >PostgreSQL 9種索引的原理和應用場景

PostgreSQL 9種索引的原理和應用場景

標籤

PostgreSQL , btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap

背景

PostgreSQL 擁有眾多開放特性,例如

1、開放的資料型別介面,使得PG支援超級豐富的資料型別,除了傳統資料庫支援的型別,還支援GIS,JSON,RANGE,IP,ISBN,影象特徵值,化學,DNA等等擴充套件的型別,使用者還可以根據實際業務擴充套件更多的型別。

2、開放的操作符介面,使得PG不僅僅支援常見的型別操作符,還支援擴充套件的操作符,例如 距離符,邏輯並、交、差符號,影象相似符號,幾何計算符號等等擴充套件的符號,使用者還可以根據實際業務擴充套件更多的操作符。

3、開放的外部資料來源介面,使得PG支援豐富的外部資料來源,例如可以通過FDW讀寫MySQL, redis, mongo, oracle, sqlserver, hive, www, hbase, ldap, 等等只要你能想到的資料來源都可以通過FDW介面讀寫。

4、開放的語言介面,使得PG支援幾乎地球上所有的程式語言作為資料庫的函式、儲存過程語言,例如plpython , plperl , pljava , plR , plCUDA , plshell等等。使用者可以通過language handler擴充套件PG的語言支援。

5、開放的索引介面,使得PG支援非常豐富的索引方法,例如btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap (greenplum extend),使用者可以根據不同的資料型別,以及查詢的場景,選擇不同的索引。

6、PG內部還支援BitmapAnd, BitmapOr的優化方法,可以合併多個索引的掃描操作,從而提升多個索引資料訪問的效率。

不同的索引介面針對的資料型別、業務場景是不一樣的,接下來針對每一種索引,介紹一下它的原理和應用場景。

一、btree

原理

應用場景

b-tree適合所有的資料型別,支援排序,支援大於、小於、等於、大於或等於、小於或等於的搜尋。

索引與遞迴查詢結合,還能實現快速的稀疏檢索。

例子

postgres=# create table t_btree(id int, info text);  
CREATE TABLE  
postgres=# insert into t_btree select generate_series(1,10000), md5(random()::text) ;  
INSERT 0 10000  
postgres=# create index idx_t_btree_1 on t_btree using btree (id);  
CREATE INDEX  
postgres=# explain (analyze,verbose,timing,costs,buffers) select * from t_btree where id=1;  
                                                          QUERY PLAN                                                             
-------------------------------------------------------------------------------------------------------------------------------  
 Index Scan using idx_t_btree_1 on public.t_btree  (cost=0.29..3.30 rows=1 width=37) (actual time=0.027..0.027 rows=1 loops=1)  
   Output: id, info  
   Index Cond: (t_btree.id = 1)  
   Buffers: shared hit=1 read=2  
 Planning time: 0.292 ms  
 Execution time: 0.050 ms  
(6 rows)  

二、hash

原理