テーブルに行が1つしかない場合は、もちろん、インデックスのカーディナリティは1である必要があります。一意の値の数を数えているだけです。
インデックスをバケットに基づくルックアップテーブル(ハッシュなど)と考える場合、カーディナリティはバケットの数です。
仕組みは次のとおりです。一連の列にインデックスを作成する場合(a,b,c,d)
、次に、データベースはテーブル内のすべての行を調べ、各行について、それらの4つの列の順序付けられた4つ組を調べます。テーブルが次のようになっているとしましょう:
a b c d e
-- -- -- -- --
1 1 1 1 200
1 1 1 1 300
1 2 1 1 200
1 3 1 1 200
したがって、データベースが調べるのは4つの列(a、b、c、d)だけです:
a b c d
-- -- -- --
1 1 1 1
1 2 1 1
1 3 1 1
一意の行が3つしか残っていないことがわかりますか?それらは私たちのバケツになりますが、私たちはそれに戻ります。実際には、テーブルの各行にレコードIDまたは行識別子もあります。したがって、元のテーブルは次のようになります。
(row id) a b c d e
-------- -- -- -- -- --
00000001 1 1 1 1 200
00000002 1 1 1 1 300
00000003 1 2 1 1 200
00000004 1 3 1 1 200
したがって、(a、b、c、d)の4つの列だけを見ると、実際には行IDも見ています:
(row id) a b c d
-------- -- -- -- --
00000001 1 1 1 1
00000002 1 1 1 1
00000003 1 2 1 1
00000004 1 3 1 1
ただし、行IDではなく(a、b、c、d)でルックアップを実行したいので、次のように生成します。
(a,b,c,d) (row id)
--------- --------
1,1,1,1 00000001
1,1,1,1 00000002
1,2,1,1 00000003
1,3,1,1 00000004
最後に、同一の(a、b、c、d)値を持つ行のすべての行IDをグループ化します。
(a,b,c,d) (row id)
--------- ---------------------
1,1,1,1 00000001 and 00000002
1,2,1,1 00000003
1,3,1,1 00000004
分かりますか? (1,1,1,1)(1,2,1,1)と(1,3,1,1)である(a、b、c、d)の値は、ルックアップテーブルのキーになりました元のテーブルの行に追加します。
実際には、これは実際には起こりませんが、インデックスの「ナイーブ」(つまり、単純な)実装がどのように行われるかについての良いアイデアが得られるはずです。
しかし、肝心なのはこれです。カーディナリティは、インデックスにある一意の行の数を測定するだけです。この例では、ルックアップテーブルのキーの数は3でした。
お役に立てば幸いです。