無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

11.2. インデックスの種類

PostgreSQL では、B-tree、Hash、GiST、SP-GiST、GINといった複数の種類のインデックスを使用可能です。 インデックスの各種類は、異なる種類の問い合わせに最も適した、異なるアルゴリズムを使用します。 デフォルトで CREATE INDEX コマンドは、B-treeインデックスを作成し、それはほとんどの一般的状況に適合します。

B-treeインデックスは、ある順番でソート可能なデータに対する等価性や範囲を問い合わせることを扱うことができます。 具体的には、 PostgreSQL の問い合わせプランナは、インデックスの付いた列を次の演算子を使用して比較する場合に、B-treeインデックスの使用を検討します。

<
<=
=
>=
>

また、 BETWEEN IN などのこれらの演算子の組み合わせと等価な式をB-treeインデックス検索で実装することができます。 インデックスの付いた列に対する IS NULL IS NOT NULL でもB-treeインデックスを使用することができます。

オプティマイザは、パターンマッチ演算子 LIKE ~ を含む問い合わせでも、そのパターンが定数であり、先頭文字列を指定している 場合 B-treeインデックスを使用することができます。 例えば、 col LIKE 'foo%' または col ~ '^foo' です。 col LIKE '%bar' では使用されません。 しかし、データベースがCロケールを使用していない場合、パターンマッチ問い合わせのインデックス付けをサポートする特別な演算子クラスでインデックスを作成しなければなりません。 後述の 項11.9 を参照してください。 なお、 ILIKE ~* でもB-treeインデックスを使用することができますが、パターンが英字以外の文字、つまり、大文字小文字の違いの影響がない文字で始まる場合のみです。

B-treeインデックスをソートされた順序でデータを受けとるために使用することもできます。 これは常に単純なスキャンとソート処理より高速になるものではありませんが、よく役に立つことがあります。

ハッシュインデックスは単純な等価性比較のみを扱うことができます。 問い合わせプランナでは、インデックスの付いた列を = 演算子を使用して比較する場合に、ハッシュインデックスの使用を検討します。 ハッシュインデックスを作成するには、以下のようなコマンドを使用してください。

CREATE INDEX 

name

 ON 

table

 USING hash (

column

);

注意

現在ハッシュインデックス操作はWALに記録されません。 そのため、データベースクラッシュの後ハッシュインデックスを REINDEX で再構築しなければならない可能性があります。 また、最初のバックアップを取得して以降、ストリーミングレプリケーションやファイルベースのレプリケーションでは変更が反映されないため、その後ハッシュインデックスを使うクエリは誤った結果を返します。 これらの理由により、ハッシュインデックスの使用は現在お勧めできません。

GiSTインデックスは単一種類のインデックスではなく、多くの異なるインデックス戦略を実装することができる基盤です。 したがって、具体的なGiSTインデックスで使用できる演算子はインデックス戦略( 演算子クラス )によって異なります。 例えば、 PostgreSQL の標準配布物には、複数の二次元幾何データ型用のGiST演算子クラスが含まれています。 これらの演算子を使用してインデックス付けされた問い合わせをサポートします。

<<
&<
&>
>>
<<|
&<|
|&>
|>>
@>
<@
~=
&&

(これらの演算子の意味については 項9.11 を参照してください。) 他の多くのGiST演算子クラスが contrib 群や別のプロジェクトとして利用可能です。 詳細は 第55章 を参照してください。

GiSTインデックスは以下のような "最近傍" 検索を最適化する機能も持ちます。

SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;

これは指定された対象地点に最も近い10箇所を見つけ出します。 繰り返しますが、これができるかどうかは使用される特定の演算子クラスに依存します。

SP-GiSTインデックスは、GiSTインデックスと同様に様々な種類の検索を支援する基盤を提供します。 SP-GiSTインデックスは広域な異なる不均衡でディスクベースのデータ構造、つまり、四分木,kd木、基数木のような実装を認めます。 例えば、 PostgreSQL 標準配布物には、以下の演算子を使用する問い合わせに対するインデックスをサポートする2次元の点用のSP-GiST用の演算子クラスが含まれています。

<<
>>
~=
<@
<^
>^

(演算子の意味は以下を参照してください 項9.11 ) 詳細は 第56章 を参照してください。

GINは転置インデックスであり、例えば配列など複数のキーを持つ値を扱うことができます。 GiSTやSP-GiST同様、GINも多くの異なるユーザ定義のインデックス戦略を持つことができ、GINが使用できる具体的な演算子はインデックス戦略によって変化します。 例えば、 PostgreSQL 標準配布物には、1次元配列用のGIN演算子クラスが含まれています。 これは、以下の演算子を使用する問い合わせに対するインデックスをサポートします。

<@
@>
=
&&

(これらの演算子の意味については 項9.18 を参照してください。) 他の多くのGIN演算子クラスは contrib 群または別のプロジェクトで利用可能です。 詳細は 第57章 を参照してください。


powered by SEO.CUG.NET