はじめに
インデックスについて理解があいまいだったので本で読んだ内容をまとめました。
インデックスとは
キー値とそれに結びつく情報(実データ/ポインタ)をもつデータの配列。
インデックスを使用しない場合、DBMSはテーブルのデータを順に辿ってデータを探す(=フルテーブルスキャン)必要があるが、インデックスを使用することで特定のデータに狙い撃ちでアクセスできる。
B-treeインデックスとは
最もポピュラーなインデックスの形式。
ツリー(木)構造になっており、ツリーを上から順に辿って目的のデータを検索する。→1段辿るごとにデータが絞られていく。
ツリー内のデータはソートされた状態。
B-treeインデックスの特徴
1. キー値(=絞り込む項目)による検索速度のばらつきが小さい
- B-treeは最上位から最下層のノードの距離(高さ)が一定であるため(=平衡木)、
キー値に何を指定しても一定の速さで検索できる。
2. テーブルのデータ量が増えてもインデックスの検索/更新にかかる時間はほぼ増えない
- B-treeの高さは平均的に3~4程度であり、データ量が増えた際には高さではなく幅が大きくなる
→ データ量が増えても最上位から最下層までの到達時間(=検索時間)は変わらない
3. 検索/挿入/更新/削除の処理時間が同程度
- インデックスの種類によっては検索が高速だが更新に時間がかかるものもあるが、B-treeインデックスは検索/挿入/更新/削除の処理時間が同程度。
- 上記の通り、データ量が増えた場合も処理時間はほぼ変化しない。
4. 等号(=)以外の検索が可能
- B-treeは構築時にキー値をソートする。
- 不等号を使用した検索や範囲検索の場合に、検索値をインデックスで一つまで絞り込むことができなくても、"ある特定のデータよりも右/左" のようにデータを絞りこむことは可能なので検索の高速化が可能になる。
- 否定条件(!=, <>)の場合は、インデックスで絞り込んだ結果が"特定のデータ以外の全てのデータ"となるため絞り込みが効かない。
5. ソート処理を省略することができる
- B-treeは構築時にキー値をソートする。B-treeインデックスが存在する列をORDER BY句のキーとして指定した場合、ソート処理をスキップすることができ、パフォーマンス向上に繋がる。
- SQLで明示的にORDER BY句以外にも、下記の処理をした場合は暗黙にDBMS内でソートが行われるが、これらも同様にB-treeインデックスが存在する列をソート対象とする場合はソート処理をスキップできる。
- 集約関数(COUNT, SUM, COUNT, SUM, AVG, MIN, COUNT, SUM, AVG, MIN, MAX)
- 集合演算(UNION, INTERSECT, INTERSECT, EXCEPT)
参考書籍
「達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ」 ミック 著