• テクノロジー

クラスタ化インデックスとかカバリングインデックスについてどうせ忘れるからまとめる

SQL Serverを使ってて、曖昧にしかわからないところがあったので少し調べてみた。

クラスタ化 / 非クラスタ化インデックスの違い

MySQLにも同じ話があったんだね。まず参考にしたのはMSDN。

クラスター化インデックスと非クラスター化インデックスの概念

まさにぴったりのタイトルじゃんと思ったんだけどいまいちよくわからない。 いや、わかったっちゃわかったんだけど、だからどうなるとか、だからどうする、っていうところが掴めなかった。

ここでわかったこと

クラスタ化インデックスは、

  • 1テーブルに1つしか作れない。
  • これがあると指定されたインデックスの値によってソートされた構造体が出来る。(テーブルの構造ごとそうなる?)
  • クラスタ化インデックスが設定されていないテーブルはヒープと呼ばれる未ソートの状態になる。

非クラスタ化インデックスは、

  • テーブルとは別に構造を持つ。
  • 実データじゃなく、実データへのポインタを持つ。

次に参考にさせてもらったのがこっち。

SQL Serverのインデックス構造(前編) (12)

ここは非常にわかりやすかった

B-Treeのイメージも、SQL Server上での実装が具体的にイメージ出来たし、 非クラスタ化インデックスじゃ結局ランダムI/Oが発生するんだね、ってこともわかった。

RDBMSで使われるB木を学ぼう

ここでわかったこと

  • B-Treeなのでリーフノードのレベルが全部同じになる。
  • クラスタ化インデックスを利用したクエリの場合、リーフノードに実データがあるのでランダムI/Oが発生しない。
  • 非クラスタ化インデックスを利用したクエリの場合、リーフノードにはポインタしかないので、ランダムI/Oが発生する。

こっちのページはよくわかんなかった。

SQL Serverの大きな特徴、クラスタ化インデックスを押さえよう!

カバリングインデックス

マルチカラムインデックスと混同するよね。これは結構わかりやすく書いてくれている記事があった。

クエリが必要とするカラムがすべてインデックスに含まれている場合、インデックスだけを読めば良いのでとても速い、というもの。

MySQLのインデックスを学ぶ (1)

こっちの記事もわかりやすい。

カバーリング インデックスは、WHERE 句およびクエリ列選択の形態をとるすべての列を含む、非クラスタ化インデックスです。

SQL インデックスを最適化する方法