PostgreSQL-インデックス

インデックスは、データベース検索エンジンがデータ取得を高速化するために使用できる特別なルックアップテーブルです。簡単に言えば、インデックスはテーブル内のデータへのポインタです。データベースの索引は、本の裏にある索引と非常によく似ています。

たとえば、特定のトピックについて説明している本のすべてのページを参照する場合は、最初にすべてのトピックをアルファベット順にリストするインデックスを参照してから、1つ以上の特定のページ番号を参照する必要があります。

インデックスは、SELECTクエリとWHERE句を高速化するのに役立ちます。ただし、UPDATEステートメントとINSERTステートメントを使用すると、データ入力が遅くなります。インデックスは、データに影響を与えることなく作成または削除できます。

インデックスの作成には、CREATE INDEXステートメントが含まれます。これにより、インデックスに名前を付けたり、テーブルとインデックスを作成する列を指定したり、インデックスが昇順か降順かを指定したりできます。

インデックスは、UNIQUE制約と同様に一意にすることもできます。この点で、インデックスは、インデックスが存在する列または列の組み合わせでのエントリの重複を防ぎます。

CREATEINDEXコマンド

の基本構文 CREATE INDEX 次のとおりです-

CREATE INDEX index_name ON table_name;

インデックスタイプ

PostgreSQLは、Bツリー、ハッシュ、GiST、SP-GiST、およびGINのいくつかのインデックスタイプを提供します。各インデックスタイプは、さまざまなタイプのクエリに最適なさまざまなアルゴリズムを使用します。デフォルトでは、CREATE INDEXコマンドは、最も一般的な状況に適合するBツリーインデックスを作成します。

単一列インデックス

単一列インデックスは、1つのテーブル列のみに基づいて作成されるインデックスです。基本的な構文は次のとおりです-

CREATE INDEX index_name
ON table_name (column_name);

複数列のインデックス

複数列のインデックスは、テーブルの複数の列で定義されます。基本的な構文は次のとおりです-

CREATE INDEX index_name
ON table_name (column1_name, column2_name);

単一列インデックスを作成するか複数列インデックスを作成するかにかかわらず、クエリのWHERE句でフィルタ条件として非常に頻繁に使用する可能性のある列を考慮してください。

使用する列が1つだけの場合は、単一列のインデックスを選択する必要があります。WHERE句でフィルタとして頻繁に使用される列が2つ以上ある場合は、複数列のインデックスが最適です。

一意のインデックス

一意のインデックスは、パフォーマンスだけでなく、データの整合性にも使用されます。一意のインデックスでは、重複する値をテーブルに挿入することはできません。基本的な構文は次のとおりです-

CREATE UNIQUE INDEX index_name
on table_name (column_name);

部分インデックス

部分インデックスは、テーブルのサブセット上に構築されたインデックスです。サブセットは、条件式(部分インデックスの述語と呼ばれます)によって定義されます。索引には、述部を満たすテーブル行のエントリーのみが含まれます。基本的な構文は次のとおりです-

CREATE INDEX index_name
on table_name (conditional_expression);

暗黙のインデックス

暗黙インデックスは、オブジェクトの作成時にデータベースサーバーによって自動的に作成されるインデックスです。主キー制約と一意の制約のインデックスが自動的に作成されます。

以下は、給与列のCOMPANYテーブルにインデックスを作成する例です。

# CREATE INDEX salary_index ON COMPANY (salary);

それでは、COMPANYテーブルで利用可能なすべてのインデックスを使用してリストアップしましょう。 \d company コマンド。

# \d company

これにより、次の結果が生成されます。ここで、company_pkeyは、テーブルの作成時に作成された暗黙のインデックスです。

Table "public.company"
 Column  |     Type      | Modifiers
---------+---------------+-----------
 id      | integer       | not null
 name    | text          | not null
 age     | integer       | not null
 address | character(50) |
 salary  | real          |
Indexes:
    "company_pkey" PRIMARY KEY, btree (id)
    "salary_index" btree (salary)

を使用して、データベース全体のインデックス全体を一覧表示できます。 \di コマンド-

DROPINDEXコマンド

PostgreSQLを使用してインデックスを削除できます DROPコマンド。パフォーマンスが低下または改善される可能性があるため、インデックスを削除するときは注意が必要です。

基本的な構文は次のとおりです-

DROP INDEX index_name;

次のステートメントを使用して、以前に作成したインデックスを削除できます-

# DROP INDEX salary_index;

インデックスはいつ避けるべきですか?

インデックスはデータベースのパフォーマンスを向上させることを目的としていますが、回避する必要がある場合があります。次のガイドラインは、インデックスの使用をいつ再検討する必要があるかを示しています。

  • 小さなテーブルではインデックスを使用しないでください。

  • 頻繁に大規模なバッチ更新または挿入操作が行われるテーブル。

  • 多数のNULL値を含む列にインデックスを使用しないでください。

  • 頻繁に操作される列にはインデックスを付けないでください。