1

我有一个约 60,000 行的静态数据库。有一个特定的列有大约 30,000 个唯一条目。鉴于该比率(某列中的 60,000 行/30,000 个唯一条目),是否值得创建一个包含这些条目的新表,并从主表链接到它?或者这会带来更多的麻烦而不是它的价值?

以更具体的方式提出这个问题:通过将这个字段分离到它自己的表中,我会获得更多的效率吗?

** 更新 **

我们谈论的是一个 VARCHAR(100) 字段,但实际上,我怀疑任何条目都使用了这么多空间——我很可能将其缩减为 VARCHAR(50)。示例条目:“The Gas Patch and Little Canada”和“Kora Temple Masonic Bldg. George Coombs”

4

1 回答 1

2

如果该字段是一个通常包含大约 30 个字符的 VARCHAR(255),另一种方法是在主表中存储一个 4 字节整数并使用具有 4 字节整数和 VARCHAR(255) 的第二个表,然后您正在考虑节省一些空间。

旧方案:

T1: 30 bytes * 60 K entries = 1800 KiB.

新方案:

T1:  4       bytes * 60 K entries =  240 KiB
T2: (4 + 30) bytes * 30 K entries = 1020 KiB

所以,这粗略地节省了 1800 - 1260 = 540 KiB 空间。如果必要时在 T2 中的整数列上建立索引,则会失去更多空间。如果数据的平均长度大于 30 字节,则空间节省会增加。如果重复行的比率增加,则节省会增加。

节省空间是否显着取决于您的上下文。如果您需要多半兆字节的内存,那么您就得到了——如果您确定不需要使用 2 字节整数而不是 4 字节整数(120 + 960 KiB = 1080 KiB;节省 720 KiB)。另一方面,如果您真的没有注意到可用的数 GB 存储中的半兆字节,那么它就变成了一个更实际的问题。维护两个表比较困难,但可以保证每次使用的名称都相同。维护一张表意味着您必须确保正确处理名称对 - 或者,更有可能的是,您忽略了这种可能性,并且最终在应该有对的地方没有对,或者在应该有的地方得到了三胞胎双胞胎。

显然,如果重复的类型是 4 字节整数,则使用两个表不会节省任何东西;这将花费你的空间。

因此,很大程度上取决于您没有告诉我们的内容。类型是一个关键问题。另一个是重复背后的语义。

于 2012-12-15T19:25:57.940 回答