Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
CREATE INDEX
インデックス(索引)を作成してクエリの検索速度を向上させます。よく検索・結合される列に設定します。
構文
-- インデックスを作成します。 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 テーブル名 が必要です。 |
サンプルコード
-- email 列でよく検索するためインデックスを作成します。 CREATE INDEX idx_members_email ON members (email); -- email の重複を禁止するユニークインデックスを作成します。 CREATE UNIQUE INDEX idx_members_email_unique ON members (email); -- 部署と給与を組み合わせた複合インデックスを作成します。 CREATE INDEX idx_employees_dept_salary ON employees (department, salary); -- インデックスの一覧を確認します(MySQL)。 SHOW INDEX FROM members; -- 不要になったインデックスを削除します(MySQL)。 DROP INDEX idx_members_email ON members;
実行結果
-- 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 | -- +---------+------------+-------------------------+-------------+-------------+
データベース別の書き方
『CREATE INDEX』『CREATE UNIQUE INDEX』は MySQL・PostgreSQL・Oracle・SQL Server・SQLite で共通して使用できます。
CREATE INDEX idx_members_email ON members (email); CREATE UNIQUE INDEX idx_members_email_unique ON members (email);
『DROP INDEX』の構文はデータベースによって異なります。MySQL では『ON テーブル名』が必要ですが、PostgreSQL・Oracle・SQLite ではインデックス名だけで削除できます。
-- MySQL(ON テーブル名 が必要)。 DROP INDEX idx_members_email ON members; -- PostgreSQL・Oracle・SQLite(テーブル名は不要)。 DROP INDEX idx_members_email;
SQL Server でも『ON テーブル名』は不要ですが、スキーマを指定する形式になります。
-- SQL Server。 DROP INDEX idx_members_email ON members;
インデックスの一覧を確認するコマンドもデータベースごとに異なります。
-- MySQL。 SHOW INDEX FROM members; -- PostgreSQL。 SELECT * FROM pg_indexes WHERE tablename = 'members'; -- Oracle。 SELECT index_name, column_name FROM user_ind_columns WHERE table_name = 'MEMBERS'; -- SQL Server。 EXEC sp_helpindex 'members';
概要
インデックスはWHERE句・JOIN・ORDER BYで使われる列に設定すると効果的です。ただし、インデックスを増やしすぎると INSERT・UPDATE・DELETE の速度が低下します。これはデータの更新のたびにインデックスも更新が必要になるためです。必要な列だけに絞ることが重要です。
主キー(PRIMARY KEY)には自動的にインデックスが作成されます。また、外部キー(FOREIGN KEY)の参照元列にもインデックスを設定するとJOINのパフォーマンスが向上します。
クエリが実際にインデックスを使用しているか確認するには『EXPLAIN』を活用してください。テーブルの作成・変更は『CREATE TABLE』・『ALTER TABLE』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。