【问题标题】:Does MYSQL stores it in an optimal way it if the same string is stored in multiple rows?如果相同的字符串存储在多行中,MYSQL 是否以最佳方式存储它?
【发布时间】:2009-08-10 11:30:24
【问题描述】:

我有一个表,其中一个列是一种 id 字符串,用于对表中的几行进行分组。假设列名是“map”,map 的值之一是例如“沃尔玛”。该列上有一个索引,因为我用它来过滤属于某个地图的那些行。

我有很多这样的地图,我不知道不同的地图值从表格中占用了多少空间。 MYSQL 是否识别为多行存储相同的映射值并在内部仅存储一次并且仅使用内部数字 id 引用它?

或者如果我想减小表的大小,我是否必须用数字 id 显式替换映射字符串并使用不同的表将映射字符串与 id 配对?

【问题讨论】:

    标签: mysql database storage


    【解决方案1】:

    MySQL 将存储每一行​​的全部数据,无论数据是否已经存在于不同的行中。

    如果您有一组有限的选项,您可以使用 ENUM 字段,否则您可以将名称拉入另一个表并加入它。

    【讨论】:

    • 奇怪的MYSQL做不到。它在列上有一个索引,因此它可以知道一个值是否被多次使用。然后我会研究选项。
    【解决方案2】:

    我认为 MySQL 每次都会复制您的内容:它会逐行存储数据,除非您另有明确说明(如您所建议的那样,将数据放在另一个表中)。

    使用另一个表意味着您需要在某些查询中添加 JOIN:您可能需要考虑一下数据的大小(它们有那么大吗?),与(small ?) 你可能会因为加入而遇到性能损失。

    另一种解决方案是使用ENUM 数据类型,至少如果您事先知道表中将包含哪个字符串,并且只有其中的几个。

    最后,另一种解决方案可能是存储一个与字符串相对应的整数“代码”,并由您的应用程序将这些代码转换为字符串,完全在数据库之外(或使用一些表来存储对应关系,但有由您的应用程序缓存的表,而不是在 SQL 查询中使用连接)。
    它不会像“干净”那样“干净”,但可能对性能更好——不过,这可能是某种微优化,在您的情况下是不必要的......

    【讨论】:

      【解决方案3】:

      如果您一遍又一遍地使用相同的值,那么将其移动到单独的表中是有充分理由的,完全不考虑磁盘空间:避免数据不一致的问题。

      假设您有一个 Stores 表,其中包含一个 StoreName 列。在 StoreName "WalMart" 的值中出现 300 次,然后有一个 "BalMart"。这只是“沃尔玛”的拼写错误,还是不同的商店?

      此外,如果与存储关联的其他数据在整个链中保持不变,您应该只存储一次,而不是重复存储。

      当然,如果您只是在地图上显示位置并且您真的不在乎它们是什么,它只是一个要显示的名称,那么这一切都无关紧要。

      如果是这样的话,那么购买更大的磁盘可能比重新设计数据库来为每条记录节省几个字节更简单。因为如果我们在这里讨论地名的任意字符串,那么尝试查找重复项并对其进行查找可能需要大量工作而收效甚微。

      【讨论】:

        猜你喜欢
        • 2013-03-02
        • 2012-12-18
        • 2010-12-15
        • 1970-01-01
        • 2011-10-19
        • 1970-01-01
        • 2011-08-28
        • 2012-08-15
        • 2017-03-14
        相关资源
        最近更新 更多