DBにおけるインデックスってなんぞや...?メリット・デメリットについて
インデックスてなに...これ全然知らないのやばくね...と思い、調べて自分なりにまとめてみた。
参考にさせていただいたサイト
- みんなのwiki
- 簡単にざっと理解できる
インデックスの意味とメリット・デメリット - SQLite入門
- 上の記事の次に読めば理解が深まる
1週間で学ぶIT基礎の基礎 - すぐわかるデータベースの基礎(3):ITpro
インデックスとは
「インデックス」 = 「テーブルとは別に検索ように最適化された状態のデータ」
と認識すればよさそう。あるコンテキストにそってソートしたりフィルターした別のデータ群(インデックス・テーブル)みたいな感じかな。
インデックス・テーブルは,検索対象となるデータを格納したフィールドと,そのデータが実際のテーブルでどの位置にあるかを示す値を格納したフィールドで構成されます
引用:http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20000919/1/
例えば名前を検索対象にするときは、インデックス・テーブルは主キーと名前だけのカラムを持つテーブルになる。
インデックスの方式について
方式はたくさんあるみたいだ。
インデックスのデータ構造は基本的にキー列のみになるらしい(Wikipedia)。なので実際のデータをいじるより効率的にあるデータに対して検索をかけたりすることができるということ。
構造にはB木、ハッシュ索引、ビットマップ索引などいろいろな方式があるみたい。例えば最もポピュラーに使われてる(らしい)B木はHDDみたいな記憶媒体で木構造を表すのに適したデータ構造みたいだ。
木構造で表せれば二分探索法とか高速にデータを探索できるアルゴリズムがたくさんあるしより高速なデータの参照が可能になるんだろう。
インデックスのデメリット
ここまで見て素晴らしさしか感じないインデックスだけど、デメリットもあるていどはある。
まず、テーブルの更新・削除などを行うたびにインデックス・テーブルも対応してデータの更新を逐一行わないといけないので、インデックスを張りすぎるとその分やらないといけない処理が多くなる。
あとは単純に、インデックスの分だけデータの大きさが大きくなるってこと。
ということで、 DB設計のときはインデックスを無駄に多用せず適切な部分だけに使う、ということを大切にすべきだなと思いました。