如果表中只有 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) 而不是 row 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
最后,我们将具有相同 (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。
希望有帮助!