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