我要创建一个表格,其行数在1000-20000之间,而且我的字段可能重复很多...大约60%的行将具有此值,其中约每个50-100都有一个共享值。
我最近一直关注效率,我想知道将这个字符串存储在每一行(它会在8到20个字符之间)或者创建另一个表并将它们与其代表ID链接起来是否更好相反......所以在这个表中有~1-50行用int替换大约300-5000个字符串?
这是一个好方法,还是根本不需要?
答案 0 :(得分:2)
是的,在大多数情况下这是一个很好的方法。它被称为规范化,主要有两个原因:
我无法从你的问题中看出你的理由是什么原因。
两者之间的区别在于,第一个重用的值恰好相同,而第二个连接具有相同含义的值。实际差异在于如果值发生变化会发生什么,即如果一个记录的值发生变化,那么值本身是否会发生变化,以便所有其他记录也使用它更改,或者该记录是否应该连接到新值其他记录保持不变。
如果这是第一个原因,那么您将节省数据库中的空间,但更新记录会更复杂。如果出于第二个原因,您不仅可以节省空间,还可以降低不一致的风险,因为值只存储在一个地方。
答案 1 :(得分:1)
这是一个为字符串提供查找表的好方法。这样,您可以在整数值上构建更高效的索引。这不是绝对必要的,但作为一种良好的做法,我会这样做。
答案 2 :(得分:1)
我建议使用带有外键的int
查找表(就像您在第二个场景中描述的那样)。这将导致索引比索引VARCHAR小得多,因此所需的存储空间会更小。它也应该表现得更好。
答案 3 :(得分:1)
阿维图斯是对的,创建查找通常是一种很好的做法。
考虑一下你将使用这个表的JOINS.1000-20000行并不是MySQL要处理的很多行。如果你没有,我不会打扰查找,只需索引列。
但是一旦你开始与其他(大小相同)加入表格,那就是性能损失的来源,你可以(最有可能)通过引入查找来补偿。