我有一个约60,000行的静态数据库。有一个列有大约30,000个唯一条目。鉴于该比率(某列中60,000行/ 30,000个唯一条目),是否值得创建一个包含其中条目的新表,并从主表链接到它?或者这会比它的价值更麻烦?
以更具体的方式提出问题:通过将此字段分离到自己的表中,我可以获得更高的效率吗?
**更新**
我们谈论的是VARCHAR(100)字段,但实际上,我怀疑任何条目都使用了那么多空间 - 我很可能将其修剪为VARCHAR(50)。参赛作品:“The Gas Patch and Little Canada”和“Kora Temple Masonic Bldg.George Coombs”
答案 0 :(得分:2)
如果字段是VARCHAR(255),通常包含大约30个字符,则替代方法是在主表中存储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)来超过65535个不同的条目,你可以挤出更多KiB = 1080 KiB;节省720 KiB)。另一方面,如果您真的不会注意到可用的数GB存储中的半兆字节,那么它就会成为一个更实际的问题。维护两个表是更难的工作,但保证每次使用时名称都相同。维护一个表意味着你必须确保正确处理这些名称对 - 或者,更有可能的是,你忽略了这种可能性,你最终没有成对你应该有对,或者你最终得到三胞胎,你应该有doubletons。
显然,如果重复的类型是4字节整数,则使用两个表将不保存任何内容;这将耗费你的空间。
因此,很多事情取决于你没有告诉我们的事情。类型是一个关键问题。另一个是重复背后的语义。