クラスターインデックス

くらえ!!クラスターインデックス!!

と、知らない人が聞いたらきっと特撮ヒーローの必殺技だと思うであろうこいつについて書いときます。なんというか小粒だけどぴりりとくるような、そんな小ネタです。たぶん。

クラスタインデックスと2次インデックス

InnoDBで大きなテーブルの総件数を取得する場合は''FORCE INDEX句''で主キー以外を指定する。

mysql> SELECT COUNT(*) FROM TBL FORCE INDEX other_idx;

この格言(?)はクラスタインデックスの特徴をよくあらわしていると思います。

クラスタインデックスは一回のI/O命令ですべての列値を読むことができ、1レコードだけを抽出するような処理は非常に高速です。

こんな感じでデータを保存しているのです。

my $primary = {
	1 => [ 100, abc, ... ],
	2 => [ 101, def, ... ],
	3 => [ 102, ghi, ... ],
};

セカンダリキーのインデックスは次のようになっています。主キーの場所だけを紐づけておけば、結局列値が取得できるのでこれで事足ります。

my $secondery = {
	100 => 1,
	101 => 2,
	102 => 3,
};

結果、1レコードをルックアップする場合は、最終的にプライマリキーのインデックスを調べれば、そのレコードのデータを取得することができます。

さて、今回は条件句も指定されていないので、とくに列値を必要とはしません、データサイズの小さなリーフを検索したほうがよさそうです。

InnoDBでインデックス貼る場合は頭の中でこんな感じでリーフが作られているだなーとか思いながら作業するといいかも。

以下、アフィリエイト

良書です。読んでおいたほうが良いです。

現場で使える MySQL (DB Magazine SELECTION)

この本を読めば今日から君もクラスターインデックスだ!!