インデックスの意味とメリット・デメリット
テーブルに多くのカラムが含まれていたり大量のデータが格納されている場合、テーブルから特定のデータを検索しようとすると非常に時間がかかる場合があります。このような場合に適切なカラムにインデックスを作成しておくことで検索が高速になる場合があります。ここでは SQLite におけるインデックスについての簡単な説明と、インデックスを利用する場合のメリットとデメリットについて解説します。
(Last modified: )
インデックスとは
インデックスとはテーブルの情報を探す時に検索の対象としてよく使用するカラムの値だけを取り出して検索しやすいようにしておいたものです。例えば次のような4つのカラムがあるテーブルで考えてみます。
id | name | address | old |
---|---|---|---|
1 | Suzuki | Tokyo | 24 |
2 | Yamada | Osaka | 18 |
3 | Takahashi | Nagoya | 32 |
4 | Honda | Tokyo | 16 |
5 | Endou | Tokyo | 41 |
6 | Morita | Sapporo | 27 |
7 | Fukuda | Osaka | 26 |
8 | Sano | Tokyo | 19 |
9 | Kondou | Nagoya | 38 |
10 | Imai | Osaka | 30 |
name カラムの値を検索しようとしたとき、テーブルに格納されているデータは順番に並んでいるわけではありませんので目的のデータがあるかどうか順に検索していくことになります。データがこの程度の量であればそれでも問題はありませんが、数百万ものデータが格納されている場合に頭から順に調べていくのは非常に効率が悪いです。
このような場合にインデックスを作成すると検索が高速になる場合があります。インデックスを簡単に言うと対象のカラムのデータを取り出し、高速に検索できるように手を加えて保存しておいたものです。例えば name カラムの値を対象としたインデックスを作成すると次のようなものになります。
id | name |
---|---|
5 | Endou |
7 | Fukuda |
4 | Honda |
10 | Imai |
9 | Kondou |
6 | Morita |
8 | Sano |
1 | Suzuki |
3 | Takahashi |
2 | Yamada |
このインデックスは id カラムと name カラムの値だけを保持し、name カラムの値を昇順に並び替えてデータを保存しています。name カラムの値を検索する時に、元のテーブルを検索するよりもデータ量が少なくまた並び替えも行われているので高速に検索することができます。
ではどうやって高速に検索できるようにしているのかについてですが、Wikipediaのインデックスのページを見ても B-Tree 方式や関数方式など色々方法があるようです。そして SQLite ではどのような方式を採用しているのかは分かりませんでした。
インデックスを作成することでテーブルとは別に検索用に最適化された状態で必要なデータだけがテーブルとは別に保存されるということを覚えておいて下さい。
インデックスのメリットデメリット
インデックスを作成しておくと便利ではありますがメリットだけではありません。テーブルとは別にデータを独自に保持しますので、テーブルにデータを追加するとインデックスの方にもデータが追加されます。また並び替えなどを行っている場合は、データを追加するごとに並び替えも再度行われます。結果としてデータを追加するときの処理が遅くなります。
格納されているデータが少ないテーブルでインデックスを作成したり、格納されるデータの種類が少ないカラムでインデックスを作成しても効果はそれほど期待できません。データの検索がそもそもあまり行われないカラムでインデックスを作成しても意味がありません。
インデックは便利ですがデータ追加時の処理が重くなるというデメリットもありますので、インデックスが必要かどうかについてよく検討された上で作成されるようにして下さい。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
プログラミングや開発環境構築の解説サイトを運営しています。