【问题标题】:MySQL database design with sparse column具有稀疏列的 MySQL 数据库设计
【发布时间】:2018-09-14 20:20:22
【问题描述】:

我有一个表(数百万行),其中一列是文本字段(存储 json blob)。但实际上只有大约 10-20% 是非 Null 的。 稀疏列的最佳实践是什么? 我应该

a) 保持表格不变或

b) 创建一个仅包含该 Text 列的新表?

如果我没记错的话,选项 (a) 很好,因为 InnoDB 只会动态分配该 Text 列所需的空间,对吧?有任何理由选择选项(b)吗?似乎选项(b)只会增加查询(连接)这些表的复杂性,并进一步增加空间复杂度。

【问题讨论】:

  • 确保将列声明为可为空,然后 (a) 就可以了。

标签: mysql database database-design


【解决方案1】:

MySQL(InnoDB 存储引擎)没有为 NULL 存储任何内容。好吧,每一行都有一个位域,每个可空列都有 1 位。位域后跟非 NULL 列的数据值。 VARCHAR、TEXT、BLOB 或 JSON 等可变长度列仅占用给定长度所需的空间。

所以我建议保持你的表原样,保持表中的 TEXT 字段,并在没有 JSON 数据时将其设为 NULL。

P.S.:你不是用JSON data type吗?

【讨论】:

  • 我明白了。我们没有使用 JSON 数据类型,因为将来我们可能会迁移到不同的数据格式,例如 Pandas 数据框,因此我们不想将列与任何特定类型绑定。谢谢
  • 与之相对的是YAGNI
【解决方案2】:

您提到了存储/空间方面的考虑。我认为最重要的是你将如何使用这些数据。如果你的表现还不错,可以进行类似的 "%% 匹配,那么就离开它。

非规范化数据可让您更好地查询/索引内容。

【讨论】:

    【解决方案3】:

    一般来说,做 (a) 或 (b) 都没有关系。但这里还有更多注意事项:

    • 如果您执行SELECT * 但忽略该列,则 (a) 是浪费的。
    • 某些 InnoDB ROW_FORMATs 会将“短”字符串放在表中,而不是分开;其他人会将它们存储在一个单独的块中,在主块中留下 20 或 767 个字节。 (看看这对 (a) 是否真的很重要,会变得相当乏味和令人困惑。)
    • 当您确实需要该列时,
    • (b) 在您的代码中包含 LEFT JOIN。您可能会认为这很麻烦。

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 2012-06-04
      • 2020-02-25
      • 2015-06-11
      相关资源
      最近更新 更多