sql >> データベース >  >> RDS >> PostgreSQL

異種データ型の3つのフィールドの複数列インデックス

    単一列インデックス

    Postgresは、ビットマップインデックススキャンを使用して、1つのクエリで複数のインデックスを非常に効率的に組み合わせることができます。 。ほとんどの場合、最も選択的なインデックスが選択され(または、ビットマップインデックススキャンと組み合わせて2つ)、残りはフィルタリングされます。結果セットが十分に狭くなると、それ以上のインデックスをスキャンするのは効率的ではありません。

    複数列のインデックス

    完全に一致する複数列のインデックスを作成する方がさらに高速ですが、桁違いではありません。
    配列型を含める必要があるため GINを使用することをお勧めします 索引。 AFAIK、配列型の汎用GiSTインデックスの演算子クラスがありません。 (例外はintarray integerの場合 配列。)

    integerを含めるには 列、最初に追加モジュール btree_ginをインストールします 、必要なGIN演算子クラスを提供します。 データベースごとに1回実行 :

    CREATE EXTENSION btree_gin;
    

    次に、複数列のインデックスを作成できるようになります。

    CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);
    

    インデックス列の順序は、GINインデックスには関係ありません。マニュアル:

    複数列のGINインデックスは、インデックスの列の任意のサブセットを含むクエリ条件で使用できます。 BツリーやGiSTとは異なり、インデックス検索の有効性は、クエリ条件が使用するインデックス列に関係なく同じです。

    最近傍検索

    PostGisのgeometryを含めているので タイプ、チャンスはあなたが GiSTを必要とする最も近い隣人検索をしたいです 索引。この場合、2つをお勧めします インデックス:

    CREATE INDEX tbl_ac_gist_idx ON tbl USING GiST(a, c);  -- geometry type
    CREATE INDEX tbl_bc_gin_idx  ON tbl USING GIN(b, c);
    

    integerを追加できます 列c どちらかまたは両方に。そのためには、 btree_ginのいずれかが必要です。 またはbtree_gist それぞれ、または両方。



    1. MariaDBでのDATE()のしくみ

    2. SpringBootからHerokuPostgresに接続する

    3. SQLServerのピークパフォーマンスを確保するための5つの秘訣

    4. ON [PRIMARY]とはどういう意味ですか?