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

広告

テーブルに多くのカラムが含まれていたり大量のデータが格納されている場合、テーブルから特定のデータを検索しようとすると非常に時間がかかる場合があります。このような場合に適切なカラムにインデックスを作成しておくことで検索が高速になる場合があります。具体的な作成方法は次のページ以降に解説しますので、ここではまずインデックスがどういったものであるのか解説いたします。

1.インデックスとは
2.インデックスのメリットデメリット

例として次のようなテーブルで考えてみます。このテーブルには「id」「country」「name」という3つのカラムが含まれています。

id    country    name
--------------------------
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

このテーブルで例えば「name」カラムの「Sony」というデータを検索したとします。テーブルに格納されているデータは特に順番に並んでいるわけではありませんので目的のデータがあるかどうか順に検索していくことになります。データがこの程度の量であればそれでも問題はありませんが、数百万ものデータが格納されている場合に頭から順に調べていくのは非常に効率が悪いです。

このような場合にインデックスを作成すると検索が高速になる場合があります。

インデックスを簡単に言うと対象のカラムのデータを取り出し、高速に検索できるように手を加えて保存しておいたものです。データを検索する時にテーブルではなくインデックスの方を検索しますので非常に高速に検索ができる場合があります。

ではどうやって高速に検索できるようにしているのかについてですが、Wikipediaのインデックスのページを見てもB-Tree方式や関数方式など色々方法があるようです。そしてSQLiteではどのような方式を採用しているのかは分かりませんでした。

ここでは簡単な例としてデータを並べ替えて保存した場合で考えてみます。「name」カラムを対象にインデックスを作成した時、次のように「name」カラムのデータを昇順に並べ替えて保存しておいたとします。

name
-----------
Ford
GM
Google
Google
Honda
Matsushita
Microsoft
Sharp
Sony
Toyota
Yahoo
Yahoo

先ほどと同じように「Sony」というデータを探す場合、インデックスに「S」で始まるデータはxxxから置いてあるという情報も合わせて保存されていれば頭から順に検索する場合よりも早く検索することができます。

実際にこんな方法が使われているわけではありませんが、インデックスを作成することでテーブルとは別に検索用に最適化された状態でデータが保存されるということを覚えておいて下さい。

インデックスを作成しておくと便利ではありますがメリットだけではありません。テーブルとは別にデータを独自に保持しますので、テーブルにデータを追加するとインデックスの方にもデータが追加されます。多くのインデックスを作成した場合、データを追加するたびにテーブルに加えて全てのインデックスにデータが追加されるためデータ追加時の処理が遅くなります。

格納されているデータが少ないテーブルでインデックスを作成したり、格納されるデータの種類が少ないカラムでインデックスを作成しても効果はそれほど期待できません。データの検索がそもそもあまり行われないカラムでインデックスを作成しても仕方がありません。

インデックは便利ですがデータ追加時の処理が重くなるというデメリットもありますので、インデックスが必要かどうかについてよく検討された上で作成されるようにして下さい。

( Written by Tatsuo Ikura )