基礎インデックスの種類

クラスタ化インデックス

定義

クラスタ化インデックスとは、テーブルの実データがインデックスキー順に物理的に並んで格納されている方式で、テーブル1つにつき1つしか作れない。

「テーブルの並び方」そのものが索引

通常のインデックスは「別のデータ構造として、テーブルの行を指し示すポインタを持つ」ものですが、クラスタ化インデックスは違います。 テーブル本体を索引キーの順に物理配置してしまうのです。結果、範囲検索や順序スキャンでは連続領域の読み取り一発で済みます。

クラスタ化 vs 非クラスタ(範囲検索の比較)
範囲検索:id BETWEEN AND
ヒープ表(非クラスタ)
挿入順にバラバラ配置
行ID
id
name
(1,0)42Sato
(1,1)15Tanaka
(1,2)83Suzuki
(1,3)27Ito
(2,0)61Nakamura
(2,1)4Yamada
(2,2)99Kobayashi
(2,3)33Watanabe

該当行が飛び地なので、範囲検索でも各行にランダムアクセスが必要。

クラスタ化表
キー順に物理配置
行ID
id
name
(1,0)4Yamada
(1,1)15Tanaka
(1,2)27Ito
(1,3)33Watanabe
(2,0)42Sato
(2,1)61Nakamura
(2,2)83Suzuki
(2,3)99Kobayashi

該当行が連続領域に固まっているのでシーケンシャル読み取りで効率的。

左端は行ID (page, offset)で、ページ番号とページ内オフセットの組。 クラスタ化表はid順に物理配置されているので、範囲検索の該当行が同じページ内に固まる。

「ページの並び順」を意識すると理解が深まる

テーブルはページ単位でディスクに置かれるので、範囲検索の速さは「該当行がどのページに散らばっているか」で決まります。

  • 非クラスタ化: 該当行のページは飛び地。範囲検索でも 何ページも別々に読む ランダムI/Oが発生する。
  • クラスタ化: 該当行が連続ページに固まっている。先頭ページから順に読む シーケンシャルI/Oで済む(ランダムより数十倍速い)。

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

  • 非クラスタ化: インデックス側にキーと行ポインタを持つ。範囲検索でも該当行の物理位置は飛び飛び。
  • クラスタ化: テーブルの物理的な並びそのもの。範囲検索は連続ブロックのシーケンシャルアクセスで完結。

設計時のポイント

  • 「範囲でよく引くカラム」をクラスタキーにするとI/Oが劇的に減る
  • 主キーがランダム値(UUID など)の場合、挿入のたびに物理的な再配置が発生してコストが増大するので注意
  • 1つしか作れないので、「どの検索を最も速くしたいか」を吟味する

よくある疑問

Q.クラスタ化インデックスはテーブルにいくつ作れますか?
A.実データそのものの並び順を決めるため、1テーブルにつき1つだけです。通常は主キーがそのままクラスタ化インデックスとして機能します。
Q.RDBMSごとに実装は違う?
A.はい。主キーを自動的にクラスタ化するタイプもあれば、ヒープ表を基本とし別途コマンドで一時的にキー順へ並べ替えるタイプもあります。原則としては「1テーブル1つ」の制約と「物理配置がキー順になる」性質は共通です。
Q.クラスタ化インデックスのデメリットは?
A.主キーが可変長・ランダムな値だと物理的な再配置コストが上がる(挿入が遅くなる)ことです。分散設計や連番主キーが好まれるのはこのため。

関連トピック

もっと学びたい方へ(おすすめ書籍)

本セクションはAmazonアソシエイトのリンクを含みます。購入いただくと運営者に紹介料が入る場合があります。

オンライン個別指導

もっと深くDBを学びたい方へ。

たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。

無料相談を予約する →