SQL Serverのインデックス設計基準 | Yet Another Brain

インデックス(Index)は、データベースのテーブルの各列に対して作成される、検索用のデータです。インデックスを作成することで、通常よりもクエリに対するレスポンスが早くなります。インデックスは日本語で索引を意味し、文字通り本の索引のように機能します。

例えば、データベースの参考書を買って、”インデックス” について調べたいとします。このとき普通は、本の冒頭の目次か末尾の索引から “インデックス” や “Index” などの単語とそのページ数を調べます。いちいち、一ページずつ目視で確認していく人はいないですよね・・・?

ではなぜ、末尾の索引から探すのでしょうか?

それは勿論、すぐに該当ページを見つけられるからですよね。

データベースにおけるインデックスの考え方も同じであり、SELECTによる問合せの高速化を図るために使われます。DBMSのGUIツールを使い視覚的にインデックスを作成したり、SQLだと “CREATE INDEX ~” という文を使ってインデックスを作成します。

 

特徴とか

インデックスには一般的に以下のような特徴があります。

  • 大きく分けて2種類のインデックスがある
    • インデックス:テーブルの各列に対して作成する。普通インデックスといえばこれを指すが、クラスタ索引に対して、非クラスタ索引ということもある。
    • クラスタ索引:通常はテーブルに対して1つだけ作成し、レコードをクラスタキー順にソートする
  • 本の索引が数ページ占めるように、データベースでもインデックスを作成するとその分サイズが増える
  • 構造
    • B木:多くのDBMSの実装は、このB木の派生であるB+木という構造である。
    • ハッシュ索引
    • ビットマップ索引
    • 多次元引数
    • 転置インデックス
  • なんでもかんでもインデックスを作ればいいというわけではない
    • レコード数が少ない場合は、テーブル自体を検索したほうが早い場合がある
    • 検索結果のデータ数が多い(選択度が低い)場合は、インデックスが逆にパフォーマンス低下を招くことがある
    • 通常主キーにクラスタ索引を作成するべきではない。主キーは範囲検索されることがほぼほぼ無いので、

 

db-index

 

 

B+木

索引