インデックスって? (データベース)

f:id:utouto97:20210725220811j:plain

インデックスとは

インデックスは、検索のときに参照するもので、検索にかかる時間を短縮します。
インデックスには、DBに格納されているデータの特定のカラムの値とそれに対応するデータが格納されている場所を示すポインタからなります。

「インデックスを作成するとどんないいことがあるの」

普通、DBに格納されているデータはを検索しようとしたとき、インデックスがない場合、先頭のデータから一つずつチェックしながら検索する必要があります。
この場合、計算量はO(n)となります。
nはデータ数で、データ数が数百万、数千万と多くなるにつれ、検索にかかる時間が大きくなってしまいます。

そこで、インデックスを作成することで、検索時間を短縮します。
インデックスは、特定のカラムの値で検索しやすいように管理します。
これには、データ構造が利用されます。
例えば、平衡二分探索木をインデックスに利用した場合、データの検索はO(logn)になります。
データ数に対して対数時間で検索ができるため、データ数が大きくなった場合でも検索時間はそれほど長くかかりません。

「じゃあ、全カラムにインデックス作成すればいいのでは?」

インデックスを作成するのには、デメリットもあります。

  1. データの挿入や変更時のオーバーヘッド
  2. インデックス用のデータ領域が必要

一つ目に関しては、データの挿入時や変更時にインデックステーブルもすべて更新する必要があり、その分だけオーバーヘッドとなり、余分な処理時間が必要となります。

二つ目に関しては、インデックステーブルを保持する領域が必要になる、ということです。

「どのカラムにインデックスを作成すればいいの?」

WHEREやJOINの検索条件として頻繁に利用されるカラムのインデックスを作成するのがよいです。
インデックスでパフォーマンスが改善されるのは、検索です。
そのため、検索を行うWHEREやJOINで頻繁に使われるカラムのインデックスを作成することで、パフォーマンス改善が期待できます。

逆に値の種類が少ない場合は、インデックスを作成しても効果が小さいので、インデックスは作成しないほうがよいです。
値の種類が少ない場合、例えば、「性別」カラムの場合は「男」、「女」の二つしか値の種類がなかったりします。
そのような場合だと、インデックスを作成したいてたとしても、その効果はほとんどありません。

終わり