CREATE INDEX
| 対応: | SQL-92(1992) |
|---|
インデックス(索引)を作成してクエリの検索速度を向上させます。よく検索・結合される列に設定します。
構文
インデックスを作成します。
CREATE INDEX インデックス名 ON テーブル名 (列名);
値の重複を禁止するユニークインデックスを作成します。
CREATE UNIQUE INDEX インデックス名 ON テーブル名 (列名);
複数列を対象とする複合インデックスを作成します。
CREATE INDEX インデックス名 ON テーブル名 (列名1, 列名2);
インデックスを削除します(MySQL)。
DROP INDEX インデックス名 ON テーブル名;
インデックスを削除します(PostgreSQL)。
DROP INDEX インデックス名;
構文一覧
| 構文 | 概要 |
|---|---|
| CREATE INDEX | テーブルに通常のインデックスを作成します。同じ値を持つ行が複数あっても構いません。 |
| CREATE UNIQUE INDEX | 値の重複を許可しないインデックスを作成します。UNIQUE制約と同等の効果があります。 |
| ON テーブル名 (列名) | インデックスを作成するテーブルと列を指定します。 |
| 複合インデックス | 複数列を一つのインデックスにまとめます。列の順序が重要で、先頭列への検索から効果を発揮します。 |
| DROP INDEX | 不要になったインデックスを削除します。MySQLでは ON テーブル名 が必要です。 |
サンプルコード
以下の『members』テーブルを例に説明します。
email 列でよく検索するためインデックスを作成します。
sample_create_index.sql
CREATE INDEX idx_members_email ON members (email);
Query OK, 0 rows affected
email の重複を禁止するユニークインデックスを作成します。
sample_create_index.sql
CREATE UNIQUE INDEX idx_members_email_unique ON members (email);
Query OK, 0 rows affected
名前とメールを組み合わせた複合インデックスを作成します。
sample_create_index.sql
CREATE INDEX idx_members_name_email ON members (name, email);
Query OK, 0 rows affected
インデックスの一覧を確認します(MySQL)。
sample_create_index.sql
SHOW INDEX FROM members;
+---------+------------+--------------------------+--------------+-------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | +---------+------------+--------------------------+--------------+-------------+ | members | 0 | PRIMARY | 1 | member_id | | members | 0 | idx_members_email_unique | 1 | email | | members | 1 | idx_members_email | 1 | email | +---------+------------+--------------------------+--------------+-------------+ 3 rows in set
不要になったインデックスを削除します(MySQL)。
sample_create_index.sql
DROP INDEX idx_members_email ON members;
Query OK, 0 rows affected
データベース別の書き方
『CREATE INDEX』『CREATE UNIQUE INDEX』は MySQL・PostgreSQL・SQLite で共通して使用できます。
CREATE INDEX idx_members_email ON members (email); CREATE UNIQUE INDEX idx_members_email_unique ON members (email);
『DROP INDEX』の構文はデータベースによって異なります。MySQL では『ON テーブル名』が必要ですが、PostgreSQL・SQLite ではインデックス名だけで削除できます。
-- MySQL(ON テーブル名 が必要)。 DROP INDEX idx_members_email ON members; -- PostgreSQL・SQLite(テーブル名は不要)。 DROP INDEX idx_members_email;
インデックスの一覧を確認するコマンドもデータベースごとに異なります。
-- MySQL。
SHOW INDEX FROM members;
-- PostgreSQL。
SELECT * FROM pg_indexes WHERE tablename = 'members';
-- SQLite。
PRAGMA index_list('members');
概要
インデックスはWHERE句・JOIN・ORDER BYで使われる列に設定すると効果的です。ただし、インデックスを増やしすぎると INSERT・UPDATE・DELETE の速度が低下します。これはデータの更新のたびにインデックスも更新が必要になるためです。必要な列だけに絞ることが重要です。
主キー(PRIMARY KEY)には自動的にインデックスが作成されます。また、外部キー(FOREIGN KEY)の参照元列にもインデックスを設定するとJOINのパフォーマンスが向上します。
クエリが実際にインデックスを使用しているか確認するには『EXPLAIN』を活用してください。テーブルの作成・変更は『CREATE TABLE』・『ALTER TABLE』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。