クラスターインデックス
くらえ!!クラスターインデックス!!
と、知らない人が聞いたらきっと特撮ヒーローの必殺技だと思うであろうこいつについて書いときます。なんというか小粒だけどぴりりとくるような、そんな小ネタです。たぶん。
クラスタインデックスと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でインデックス貼る場合は頭の中でこんな感じでリーフが作られているだなーとか思いながら作業するといいかも。