SQLite | インデックス(Index) | インデックスの意味とメリット・デメリット
テーブルに多数の列や大量のデータが含まれている場合、特定のデータを検索するのに時間がかかることがあります。このような場合、適切な列にインデックスを作成すると検索を高速化できます。ここでは、インデックスの概要と、使用する場合のメリット・デメリットについて説明します。
インデックスとは
インデックスとは、検索条件として頻繁に使用する列の値を取り出し、見つけやすいように整理したものです。たとえば、次の4つの列を持つテーブルがあるとします。
| id | name | address | old |
|---|---|---|---|
| 1 | devkuma | Seoul | 23 |
| 2 | kimkc | Busan | 19 |
| 3 | araikuma | Seoul | 38 |
| 4 | mykuma | Daejeon | 18 |
| 5 | yourkuma | Seoul | 17 |
| 6 | happykuma | Seoul | 24 |
name列の値を検索する場合、データは名前順に並んでいないため、保存された行を順番に調べることになります。この程度のデータ量なら問題ありませんが、数百万件のデータが保存されている場合、先頭から探す方法は非常に非効率です。
このような場合、インデックスを作成すると検索速度を向上できます。簡単に言えば、インデックスは対象列のデータを高速に検索できる形に加工して保存したものです。たとえば、name列を対象にしたインデックスは次のようになります。
| id | name |
|---|---|
| 3 | araikuma |
| 1 | devkuma |
| 2 | kimkc |
| 6 | happykuma |
| 4 | mykuma |
| 5 | yourkuma |
このインデックスはid列とname列の値だけを保持し、name列の値を昇順に並べて保存しています。元のテーブルよりデータ量が少なく、すでに並べ替えられているため、より高速に検索できます。
検索を高速化する仕組みには、B-tree方式や関数を利用する方式などさまざまな方法があります。重要なのは、インデックスが検索に必要なデータだけを、検索に適した状態でテーブルとは別に保存するという点です。
インデックスのメリットとデメリット
インデックスは便利ですが、メリットだけではありません。テーブルとは別に独自のデータを保持するため、テーブルにデータを追加するとインデックスも更新されます。また、並び順も維持する必要があるため、データ追加時の処理速度は低下します。
データ量が少ないテーブルや、値の種類が少ない列にインデックスを作成しても、大きな効果は期待できません。検索にほとんど使用しない列にインデックスを作成する意味もありません。
インデックスは検索に有用ですが、データ追加時の負荷が増えるというデメリットもあります。必要性を十分に検討してから作成してください。