インデックス (index)の作成と削除

インデックス (index)とは

インデックス (index)は、直訳すると索引、見出しのことですが、SQLにおけるインデックスの仕組みはもう少し複雑になってきます。ここではとりあえず簡潔に説明をします。

以下の様なデータを例とします。

行番号 社員番号 氏名
1行 4 鈴木一郎
2行 山田花子
3行 5 佐藤二郎
4行 2 田中太郎
5行 3 木村小次郎

この中から社員番号3を探す場合、通常は上から順番に探していくと思います。今回は3行ですがこれが何万行となるとかなり探すのが大変になります。
そこで、以下の様なデータを作成してみましょう。

社員番号 元データの行
1 2行
2 4行
3 5行
4 1行
5 3行

数字順に社員番号が並んでいるので、社員番号3の場所は大体推測できます。このようなデータをインデックスといいます。データベースとは別に、このようなデータを作成して検索を高速化する訳です。

実は、これまでに主キー(PRIMARY KEY)を設定しましたが、その際、自動的にインデックスが作成されています。インデックスを確認してみましょう。インデックスの確認には\diコマンドを入力します。

test_db=> \di
                     List of relations
 Schema |       Name        | Type  | Owner |    Table     
--------+-------------------+-------+-------+--------------
 public | customer_pkey     | index | test  | customer
 public | music_pkey        | index | test  | music
 public | order__pkey       | index | test  | order_
 public | order_detail_pkey | index | test  | order_detail
(4 rows)

インデックスの作成

インデックスの作成にはCREATE INDEXコマンドを使用します。

CREATE INDEX インデックス名 ON テーブル名 (列名)

それでは、インデックスを作成してみましょう。

インデックスの作成にはCREATE INDEXコマンドを使用します。

test_db=> CREATE INDEX music_title ON music(title);
CREATE INDEX

CREATE INDEXと表示されたら作成完了です。

先程の\diではどのカラムに対してインデックスが設定されているかはわかりません。どのカラムに対してインデックスが設定されているかを確認するには\d テーブル名を使用します。

test_db=> \d music
                                   Table "public.music"
  Column   |         Type          | Collation | Nullable |            Default             
-----------+-----------------------+-----------+----------+--------------------------------
 id        | integer               |           | not null | 
 title     | character varying(80) |           | not null | 
 artist    | character varying(80) |           |          | 'anonymous'::character varying
 price     | integer               |           |          | 
 published | date                  |           |          | 
Indexes:
    "music_pkey" PRIMARY KEY, btree (id)
    "music_title" btree (title)
Check constraints:
    "music_price_check" CHECK (price > 0)
Referenced by:
    TABLE "order_detail" CONSTRAINT "order_detail_music_id_fkey" FOREIGN KEY (music_id) REFERENCES music(id) ON UPDATE RESTRICT ON DELETE RESTRICT

インデックスの削除

インデックスの削除にはDROP INDEXコマンドを使用します。

DROP INDEX インデックス名

それでは、インデックスを削除してみましょう。

インデックスの作成にはCREATE INDEXコマンドを使用します。

test_db=> DROP INDEX music_title;
DROP INDEX

DROP INDEXと表示されたら削除完了です。

演習

今後の学習でも使用することを兼ねて、顧客テーブルcustomerのname列にインデックスcustomer_nameを作成してみましょう。

test_db=> CREATE INDEX customer_name ON customer(name);
CREATE INDEX

プログラミングの必要性

フェイスブックのザッカーバーグ氏やマイクロソフトのビル・ゲイツ氏などが、プログラミングの必要性について語っています。

おすすめアイテム

「M570」以来、実に7年ぶりのロジクール製トラックボールマウス。プログラミングをするにあたって、一度使うともう元には戻れません!