インデックスの意味とメリット・デメリット
テーブルに対してインデックスを作成する場合、考え方としてはテーブルの中の特定のカラムのデータを複製し検索が行いやすいようにしたものです。
例えば次のようなテーブルを考えて見て下さい。
(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 = 値;
ただ効果が大きく出るような複数カラムを対象としたインデックスはそれほど多くないと言われていますので、どの程度効果があるのかよく検討した上で作成するといいと思います。