如果表中只有1行,则索引的基数当然应为1.它只是计算唯一值的数量.
如果您将索引视为基于存储桶的查找表(如散列),则基数是存储桶的数量.
以下是它的工作原理:当您在一组列(a,b,c,d)上构建索引时,数据库将遍历表中的所有行,查看每行的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
但是我们想通过(a,b,c,d)而不是行id进行查找,所以我们生成这样的东西:
(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
最后,我们将具有identicle(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
看到了吗? (a,b,c,d)的值(1,1,1,1)(1,2,1,1)和(1,3,1,1)已经成为我们查询表的关键进入原始表的行.
实际上,这些都不会真的发生,但它应该让你对如何完成索引的“天真”(即直接)实现有个好主意.
但最重要的是:基数只测量索引中有多少个唯一行.在我们的示例中,查询表中的键数为3.
希望有所帮助!