インデックスの意味とメリット・デメリット

テーブルに対してインデックスを作成する場合、考え方としてはテーブルの中の特定のカラムのデータを複製し検索が行いやすいようにしたものです。

例えば次のようなテーブルを考えて見て下さい。

(id)  country    coopname
--------------------------
1     U.S.       Google
2     U.S.       Yahoo
3     U.S.       Microsoft
4     JP         Toyota
5     JP         Honda
6     U.S.       Ford
7     U.S.       GM
8     JP         Matsushita
9     JP         Sony
10    JP         Sharp
11    JP         Google
12    JP         Yahoo

このテーブルには2つのカラム「country」と「coopname」が含まれています。先頭の(id)は内部的に各データに割り当てられた番号だと考えて下さい。このテーブルの「coopname」カラムに対して例えば「Matsushita」を検索する場合、カラムに含まれるデータはバラバラですので先頭の値から最後の値まで一つ一つ順に見ていくしかありません。そこで「coopname」カラムを対象としたインデックスを作成します。

インデックスが実際にどのように作成されるのかの詳細は省略しますが、例えば「coopname」カラムの値だけを取り出し次のようにアルファベット順に並べたものと考えて下さい。

coopname     (id)
--------------------
Ford         6
GM           7
Google       1
Google       11
Honda        5
Matsushita   8
Microsoft    3
Sharp        10
Sony         9
Toyota       4
Yahoo        2
Yahoo        12

先ほどと同じように「coopname」カラムを対象に「Matsushita」を検索した場合、そのカラムに対してインデックスが作成されているとインデックスを対象に検索が行われます。インデックスはアルファベット順に並べられていますので、先頭から順に確認するような必要はなく効率よく高速に検索することができます。

インデックスの方で検索を行い該当するデータの識別番号を見つければ、その情報を元にテーブルからデータを取得します。

このように適切なインデックスを作成しておくと、データを検索する時に高速に行うことができるようになります。

メリットとデメリット

インデックスはテーブルの特定のカラムを対象に作成しますが、全てのカラムに対してインデックスを作成しておけばいいかというとそうではありません。インデックスを作成すると、テーブルにデータを追加するたびにインデックスにも同じようにデータが追加されます。あまり多くのインデックスを作成しておくとデータを追加する時に行われる処理が何倍にもなります。

そもそもテーブルに含まれるデータが少ない場合、インデックスを別に作ってもそれほど大きな効果は得る事ができません。大規模なデータが含まれるテーブルであってもあまり検索されることのないカラムでインデックスを作るのも無駄です。また格納されるデータの種類が少ない場合もあまり効果がありません(先ほどの例だと「country」カラムでインデックスを作成してもあまり大きな効果は得られません)。

そこで、ある程度多くのデータを格納するテーブルの、格納される値がそれぞれ異なるようなカラムの中で、検索がよく行われるカラムに対してインデックスを作成すると効果が高くなります。

なお、インデックスを作成したからといって、検索を行う時に何か特別な記述をする必要はありません。

SELECT カラム名 FROM テーブル名 WHERE カラム名 = 値;

上記のようなSELECT文でWHERE句の条件式に記述するカラム名に対してインデックスが作成されていれば、自動的にインデックスを使って検索が行われます。

複数のカラムを対象としたインデックス

インデックスはカラム毎に作成されますが、一つのカラムだけでなく複数のカラムを組み合わせたインデックスを作成することもできます。

例えば先ほどのテーブルで「country」カラムと「coopname」カラムの2つのカラムを対象としたインデックスを作成してみます。

country    coopname    (id)
--------------------------
JP         Google       11
JP         Honda        5
JP         Matsushita   8
JP         Sharp        10
JP         Sony         9
JP         Toyota       4
JP         Yahoo        12
U.S.       Ford         6
U.S.       GM           7
U.S.       Google       1
U.S.       Microsoft    3
U.S.       Yahoo        2

本当にこのようにインデックスが作成されるわけではなくあくまで例として見てください。複数のカラムの値を使って後から検索しやすいような形でインデックスが作成されます。

このような複数カラムを対象としたインデックスは次のようなSELECT文を実行した時に利用されます。

SELECT カラム名 FROM テーブル名 WHERE country = 値 AND coopname = 値;

ただ効果が大きく出るような複数カラムを対象としたインデックスはそれほど多くないと言われていますので、どの程度効果があるのかよく検討した上で作成するといいと思います。