我有一个表,其中一列是一种id字符串,用于对表中的多行进行分组。假设列名称是“map”,并且map的值之一是例如“沃尔玛”。该列上有一个索引,因为我用它来过滤那些属于某个地图的行。
我有很多这样的地图,我不知道不同的地图值占用了多少空间。 MYSQL是否识别为多行存储相同的映射值并在内部仅存储一次,并仅使用内部数字ID引用它?
或者我是否必须明确地用数字id替换地图字符串,如果我想减小表的大小,可以使用不同的表将地图字符串与ids配对?
答案 0 :(得分:4)
MySQL将存储每一行的整个数据,无论数据是否已存在于不同的行中。
如果您有一组有限的选项,则可以使用ENUM字段,否则您可以将名称拉入另一个表并加入其中。
答案 1 :(得分:0)
我认为MySQL每次都会复制你的内容:它会逐行存储数据,除非你另外明确指定(将数据放在另一个表中,就像你建议的那样)。
使用另一个表意味着您需要在某些查询中添加JOIN:您可能想要考虑一下数据的大小(它们是那么大吗?),与(小?)由于加入而可能遇到的性能损失。
另一个解决方案是使用ENUM数据类型,至少如果你事先知道你的表格中有哪个字符串,并且只有少数几个。
最后,另一种解决方案可能是存储与字符串对应的整数“代码”,并将这些代码转换为应用程序的字符串,完全在数据库之外(或使用某些表来存储对应关系,但是表应用程序缓存的表,而不是在SQL查询中使用连接)。
它不会那么“干净”,但可能更适合表演 - 但是,这可能是某种微观优化,在你的情况下是不必要的......
答案 2 :(得分:0)
如果您反复使用相同的值,那么将其移至单独的表有一个很好的功能原因,完全不考虑磁盘空间注意事项:避免数据不一致的问题。
假设您有一个Stores表,其中包含StoreName列。 StoreName“WalMart”中的值出现了300次,然后出现了“BalMart”。这只是“WalMart”的拼写错误,还是那个不同的商店?
此外,如果存在与商店相关联的其他数据在整个链中保持不变,则应将其存储一次而不是重复存储。
当然,如果您只是在地图上显示位置并且您真的不在乎它们是什么,那么它只是一个要显示的名称,那么这一切都无关紧要。
如果是这种情况,那么购买更大的磁盘可能比重新设计数据库只是为了节省每个记录的几个字节更简单。因为如果我们在这里谈论地名的任意字符串,那么试图找到重复项并对它们进行查找可能需要很多工作才能获得很少的收益。