データベースにおけるインデックスのメリット・デメリットを整理する

  • 2023年1月10日
  • 2023年3月2日
  • DB
DB

データベースでは数万件、場合によっては数千万、数億件のデータを扱う場合もあります。データベースに対して検索や更新といった処理を行う際、指定のデータを特定してから処理を実行する必要があり、全体のデータ数が増えるほど、特定する処理を効率化する必要があります。

このデータ検索の効率化のために用いられるのがインデックス(索引)です。

今回はデータベースにおけるインデックスについて、メリットやデメリットについて整理したいと思います。

インデックスとは

インデックスとは索引とも呼ばれ、データベースのテーブルへの検索処理を高速化させるためのものです。本の辞書などで末尾についてるあの索引そのままのイメージで、テーブルのどこに目当てのデータが存在するのかを把握するために用います。

本の辞書の場合は50音順やアルファベット順に並んでいるため、索引を見なくてもなんとなく目当ての単語の場所がわかるかもしれませんが、データベースには辞書のようにルールに従ってデータが格納されているとは限りません。

なので、インデックスがない場合はデータを最初から順に見て目当てのデータを探す必要があります。それを考えると、検索のパフォーマンスにおけるインデックスの重要性がわかると思います。

データベースにおけるインデックスはフィールド(列)単位で作成します。また、インデックスはテーブルそのものとは別の領域に作成されます。後述しますが、インデックスにはいくつか種類があり、それぞれに特徴があります。

インデックスを作成するメリット

上記のとおり、インデックスのメリットは検索処理の効率化です。インデックスを指定していない場合にはテーブル全体からデータを1つずつ調べていく必要がある必要がある検索も、インデックスがあればより少ない処理で目的のデータにたどり着くことができます。

インデックスはデータ量が膨大なテーブルであるほどその効果を発揮します。

インデックス作成が適していない場合

検索効率が上がるのであれば、とにかくインデックスをつければいいのではとなりそうですが、そうもいきません。インデックスを作成することによるデメリットも存在するのです。

データ数が少ない場合は効果を発揮しない

まず対象テーブルのデータ件数が少ない場合はインデックスを作成するメリットが得られにくいです。この場合、デメリットではないものの、インデックスを作成する意味はなくなってしまうので注意が必要です。

このとき、じゃあインデックスを作成するボーダーの件数は何件くらい?という疑問が噴出しますが、残念ながらこれに明確な答えはありません。サーバスペック等によって処理できる能力がその時々で異なるからです。

例えばデータの規模が数万件の場合、あるシステムにおいては大量データとみなされなくても、別のシステムにとっては大量データとみなされる場合もあります。その時々のマシンスペック等を加味して、非機能要件を満たすためにインデックスを作成する必要があるかを検討する必要があります。

インデックスはデータ登録、更新、削除時のコストを高める

先に少し触れましたが、インデックスはテーブルとは別の領域に管理されます。そしてテーブル自体に変更(登録、更新、削除)があった場合は、当然ながらインデックスにもその変更を反映させる必要があります。

「インデックスにもその変更を反映させる必要がある」というのが時にネックとなります。例えば、データ登録や更新が頻繁に生じるようなテーブルの場合、その度にインデックスも変更する必要が出てきます。そのため、このような場合では検索時の速度を高められたとしても、更新時の処理速度が低下し、トータルで見たときにインデックスが負担になる可能性もあります。

これと同じ観点で、多数のフィールド(列)に闇雲にインデックスを張ることもタブーです。指定したフィールド分だけインデックスを個別に作成することになるので、対象フィールドを増やせば増やすほど、インデックスは膨張します。データ変更時に膨張したインデックスに変更を加える際のコストは言うまでもありません。

インデックス作成に適する場合

先ほどはインデックス作成が適さない場合を紹介しました。では、どういった場合がインデックス作成に適しているのでしょうか。

データ数が多い場合

先ほどの逆で、検索対象となるデータ件数が多いほどインデックスはその効果を発揮します。データ件数が多いって何件くらい?という点については、その時々のサーバスペック等を加味して判断する必要があります。

フィールドの値に重複や偏りが少ない

インデックスに指定するフィールドの値の分布も重要なポイントです。インデックスに指定するフィールドの値は、なるべくバラけている方が検索速度の向上が見込めます。

100件データがあった場合、値が100通りあるようなフィールドだとインデックスに指定するフィールドとして適しているといえます。一方で、100件データがあって99件同じ値のフィールドにインデックスを張ってもその効果は見込めません。

テーブルのうち検索対象となるフィールドがだいたい定まっている

テーブルにおいて、よく検索対象となるようなフィールドが存在する場合は、そのフィールドにインデックスを張ることで検索速度の向上が見込めます。逆を言うと、滅多に検索に利用されることのないフィールドにインデックスを張っても、使われることなくメンテナンスにコストがかかるだけになってしまいます。

まとめ

データベースにおけるインデックスのメリット、デメリットについて整理しました。

データベース設計時は、むやみにインデックスを張りまくるのではなく、最適なインデックス構造を検討する必要がありそうです。

ではでは👋