Databaseで利用できるindexの種類
B-Tree
特定のユースケースでのみ他のindexを考える
Query plannerはインデックスの付いた列を< <= = >= > 演算子で比較する場合に、B-treeインデックスの使用を検討する
BETWEEN IN IS NULL NOT NULL でも使用可能
optimiserはLIKE ~ も先頭文字列での指定であればB-Treeを検討する
ハッシュマップインデックス
Hash Tableを使う
メリットもデメリットもHash Tableというデータ構造が持つ性質そのまま
メリット
等価検索(=)では定数時間で検索可能
デメリット
要素間に順序はないので範囲検索はできない
LIKEによる部分検索も不可
PostgreSQL
Query plannerはインデックスの付いた列を=演算子で比較する場合に、ハッシュマップインデックスの使用を検討する
ビットマップインデックス
データ値からビットデータを作成してインデックスとする
メリット
B-Treeが苦手な、カーディナリティの低い列に対する検索性能が良い
インデックスサイズが小さい
デメリット
レコードのデータ更新のたびにインデックスのビット値も計算しなおすので更新時の性能がよくない
GIN (Generalized Inverted Index)
フルテキスト検索を高速化するために使用できるインデックス
使えるcolumnはtsvector型のみ
転置インデックスとして、各単語(語彙)のインデックスエントリと、一致する場所の圧縮リストを含む
複数単語検索では、最初に一致した単語を見つけてから、インデックスを使用して、追加の単語が不足している行を削除することができる
tsvector値の単語(語彙)のみを格納し、その重みラベルは格納しない
重みを含む問い合わせを使用する場合は、テーブル行の再チェックが必要
GiST (Generalized Search Tree)
単一種類のインデックスではなく、多くの異なるインデックス戦略を実装することができる基盤
具体的なGiSTインデックスで使用できる演算子はインデックス戦略(演算子クラス)によって異なる
PostgreSQLのstandard distributionには、複数の二次元幾何データ型用のGiST演算子クラスが含まれている
<< &< etc.
最近傍検索なども実現できる SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
SP-GIST
SP-GiSTインデックスは、GiSTインデックスと同様に様々な種類の検索を支援する基盤を提供する
SP-GiST索引は広域な異なる不均衡でディスクベースのデータ構造、つまり、四分木、k-d tree、接尾辞木のような実装を可能にする PostgreSQLのstandard distributionには、以下の演算子を使用する問い合わせに対するインデックスをサポートする2次元の点用のSP-GiST用の演算子クラスが含まれている
<@ @> && etc.
BRIN (Block Range index)
テーブルの連続的な物理ブロックの範囲に格納された値についての要約を格納する
GiST、SP-GiST、GINと同じように、BRINは多くの異なるインデックス戦略をサポートし、BRINインデックスが使用できる具体的な演算子はインデックス戦略によって変化する
メリット
B-Treeと比較すると非常にインデックスサイズ・作成時間が小さい
論理的な値の並びが物理的なブロックの並びと一致している時系列データ、ログなどの扱いに優れる
PostgreSQL 9.5からサポートされる
製品差
InnoDB, MyISAMではデフォルトでB-treeでそれ以外使えない
使われるかどうかはわからないがかなり豊富