SQLite インデックス(Index)
インデックス(Index)は、データベース検索エンジンがデータ検索を高速化するために使用する特別なルックアップテーブルです。簡単に言うと、インデックスはテーブル内のデータを指すポインタです。データベース内のインデックスは、本の索引目次と非常に似ています。
漢字辞典の目次ページ(索引)を例にとると、ピンイン、画数、部首などで並べられた目次(索引)から、必要な漢字をすばやく見つけることができます。
インデックスは、SELECT クエリと WHERE 句を高速化するのに役立ちますが、UPDATE 文と INSERT 文を使用するときのデータ入力は遅くなります。インデックスは作成または削除できますが、データには影響しません。
CREATE INDEX 文を使用してインデックスを作成します。これにより、インデックスに名前を付け、テーブルとインデックスを作成する1つまたは複数の列を指定し、インデックスを昇順で並べるか降順で並べるかを指定できます。
インデックスは一意にすることもでき、UNIQUE 制約と同様に、列または列の組み合わせで重複エントリを防ぎます。
CREATE INDEX コマンド
CREATE INDEXの基本構文は次のとおりです。
CREATE INDEX index_name ON table_name;
単一列インデックス
単一列インデックスは、テーブルの1つの列のみに基づいて作成されるインデックスです。基本構文は次のとおりです。
CREATE INDEX index_name ON table_name (column_name);
一意インデックス
一意インデックスを使用するのは、パフォーマンスのためだけでなく、データの整合性のためでもあります。一意インデックスでは、テーブルに重複する値を挿入することはできません。基本構文は次のとおりです。
CREATE UNIQUE INDEX index_name on table_name (column_name);
複合インデックス
複合インデックスは、テーブルの2つ以上の列に基づいて作成されるインデックスです。基本構文は次のとおりです。
CREATE INDEX index_name on table_name (column1, column2);
単一列インデックスを作成するか複合インデックスを作成するかは、クエリのフィルタ条件として WHERE 句で非常に頻繁に使用する列を考慮する必要があります。
1つの列のみを使用する場合は、単一列インデックスを選択します。フィルタとしての WHERE 句で2つ以上の列が頻繁に使用される場合は、複合インデックスを選択します。
暗黙インデックス
暗黙インデックスは、オブジェクトの作成時にデータベースサーバーによって自動的に作成されるインデックスです。インデックスは、主キー制約と一意制約として自動的に作成されます。
例
以下は例です。COMPANY テーブルの salary 列にインデックスを作成します:
sqlite> CREATE INDEX salary_index ON COMPANY (salary);
次に、以下のコマンドを使用して.indices 或 .indexesCOMPANY テーブルで利用可能なすべてのインデックスを一覧表示します。次のようになります:
sqlite> .indices COMPANY
これにより次の結果が生成されます。ここでsqlite_autoindex_COMPANY_1は、テーブル作成時に作成された暗黙インデックスです。
salary_index sqlite_autoindex_COMPANY_1
データベース全体のすべてのインデックスを一覧表示するには、次のようにします:
sqlite> SELECT * FROM sqlite_master WHERE type = 'index';
DROP INDEX コマンド
インデックスは、SQLite のDROPコマンドで削除できます。インデックスを削除するときは、パフォーマンスが低下したり向上したりする可能性があるため、特に注意が必要です。
基本構文は次のとおりです。
DROP INDEX index_name;
次のステートメントを使用して、前に作成したインデックスを削除できます:
sqlite> DROP INDEX salary_index;
どのような場合にインデックスの使用を避けるべきですか?
インデックスの目的はデータベースのパフォーマンスを向上させることですが、インデックスの使用を避けるべきいくつかの状況があります。インデックスを使用する場合は、次のガイドラインを再検討する必要があります:
インデックスは小さいテーブルでは使用しないでください。
インデックスは、頻繁に大量の更新または挿入操作が行われるテーブルでは使用しないでください。
インデックスは、NULL 値を多く含む列では使用しないでください。
インデックスは、頻繁に操作される列では使用しないでください。