Postgresql-indexes
PostgreSQL-インデックス
インデックスは、データ検索を高速化するためにデータベース検索エンジンが使用できる特別なルックアップテーブルです。 簡単に言えば、インデックスはテーブル内のデータへのポインタです。 データベースのインデックスは、本の裏にあるインデックスに非常によく似ています。
たとえば、特定のトピックについて説明している本のすべてのページを参照する場合は、最初にすべてのトピックをアルファベット順にリストするインデックスを参照してから、1つ以上の特定のページ番号を参照する必要があります。
インデックスは、SELECTクエリとWHERE句を高速化するのに役立ちます。ただし、UPDATEおよびINSERTステートメントを使用すると、データ入力が遅くなります。 インデックスは、データに影響を与えずに作成または削除できます。
インデックスの作成には、CREATE INDEXステートメントが含まれます。これにより、インデックスに名前を付け、テーブルとインデックスを作成する列を指定し、インデックスが昇順か降順かを指定できます。
インデックスは、一意の制約と同様に一意にすることもできます。インデックスは、インデックスが存在する列または列の組み合わせの重複エントリを防止します。
CREATE INDEXコマンド
*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);
暗黙的なインデックス
暗黙的なインデックスは、オブジェクトの作成時にデータベースサーバーによって自動的に作成されるインデックスです。 主キー制約と一意制約のインデックスが自動的に作成されます。
例
以下は、リンクにインデックスを作成する例です。給与カラムの/postgresql/company.sql[COMPANY]テーブル-
# CREATE INDEX salary_index ON COMPANY (salary);
次に、 \ d company コマンドを使用して、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* コマンドを使用して、インデックスデータベース全体を一覧表示できます-
DROP INDEXコマンド
インデックスは、PostgreSQL DROP コマンドを使用して削除できます。 パフォーマンスが低下または改善される可能性があるため、インデックスを削除するときは注意が必要です。
基本的な構文は次のとおりです-
DROP INDEX index_name;
次のステートメントを使用して、以前に作成したインデックスを削除できます-
# DROP INDEX salary_index;
インデックスを回避する必要がある場合
インデックスはデータベースのパフォーマンスを向上させることを目的としていますが、回避する必要がある場合があります。 次のガイドラインは、インデックスの使用を再検討する必要がある場合を示しています-
- 小さいテーブルではインデックスを使用しないでください。
- 頻繁に大規模なバッチ更新または挿入操作が行われるテーブル。
- 多数のNULL値を含む列にはインデックスを使用しないでください。
- 頻繁に操作される列にはインデックスを付けないでください。