テーブルに 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 でした。
それが役立つことを願っています!