【PostgreSQL】PostgreSQLのインデックスあれこれ

■ はじめに

PostgreSQL で インデックス (index) を使う必要が出てきたので
メモっておく。

目次

【1】インデックス
【2】構文
【3】インデックスの種類

【1】インデックス

* 以下を参照。

インデックス ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2010/04/01/175501

【2】構文

CREATE INDEX [index_name] ON [table_name] (item_name);

-- 複数インデックスの場合
CREATE INDEX [index_name] ON [table_name] (item_name1, item_name2, ...);

https://www.postgresql.jp/document/10.0/html/sql-createindex.html

【3】インデックスの種類

1)B-tree
2)Hash
3)GiST
4)SP-GiST
5)GIN
6)BRIN

https://www.postgresql.jp/document/10.0/html/indexes-types.html

1)B-tree

* デフォルト

2)Hash

* Hash値による検索
* Ver9.6以前は、WAL(トランザクションログ)に未対応だったため、非推奨
* Ver10.0以降は、WAL対応

使用基準メモ

* = 演算子による検索時に効果的(uuidなどのユニークIDなど)
 (大小比較 (<,><=,>, >=)や不一致 (!=, <>)は、不向き)

https://www.intellilink.co.jp/article/column/oss-postgres02.html

3)GiST

* Generalized Search Tree(GiST、汎用検索ツリー)

使用基準メモ

* 地理情報向け
* 全文検索向け

4)SP-GiST

* Space-Partitioned GiST(SP-GiST、空間分割GiST)

https://www.postgresql.jp/document/10.0/html/spgist-intro.html

使用基準メモ

* 地理情報向け

5)GIN

* Generalized Inverted Indexes(GIN、汎用転置インデックス)

使用基準メモ

* 全文検索向け

6)BRIN

* Block Range INdex(ブロックレンジインデックス)
* データをブロックとして1つのグループとし、
 それら各グループの値の範囲(最小値と最大値)を保持することにより
 検索時の走査範囲を絞り込むことができる
 => 明らかにマッチする行が存在しないことが判断でき
  読み飛ばすことにより、検索時間を短縮できる

https://www.postgresql.jp/document/10.0/html/brin-intro.html
https://www.sraoss.co.jp/PostgreSQL/Manual/document/11/brin-intro.html

使用基準メモ

* 巨大なデータほど高い効果が得られる

構文

CREATE INDEX インデックス名 ON テーブル名 USING brin(カラム名);

参考文献
https://thinkit.co.jp/article/9678

関連記事

PostgreSQL ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2014/03/08/000100
インデックス ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2010/04/01/175501
MySQLのインデックスあれこれ
https://dk521123.hatenablog.com/entry/2018/03/20/220724
SQL アンチパターン ~ 目次 ~
https://dk521123.hatenablog.com/entry/2016/07/02/212547