言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. SQL辞典
  3. CREATE INDEX

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』テーブルを例に説明します。

members member_id name email 1 五条悟 gojo@example.com 2 虎杖悠仁 itadori@example.com 3 伏黒恵 fushiguro@example.com 3 rows in set

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』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。