基于稀疏列的MySQL数据库设计

基于稀疏列的MySQL数据库设计,mysql,database,database-design,Mysql,Database,Database Design,我有一个表(数百万行),其中一列是文本字段(存储json blob)。但实际上只有10-20%是非空的。 对于稀疏列,最佳做法是什么? 我应该吗 a) 保持桌子原样就行了 b) 是否仅使用该文本列创建新表 如果我没有弄错的话,选项(a)是可以的,因为InnoDB将动态地只分配该文本列所需的空间,对吗?是否有任何理由选择(b)项?看起来选项(b)只会增加查询(连接)这些表的复杂性,并进一步增加空间复杂性。MySQL(InnoDB存储引擎)不存储空值。嗯,每行有一个位字段,每个可为空的列有1位。位字

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

a) 保持桌子原样就行了

b) 是否仅使用该文本列创建新表

如果我没有弄错的话,选项(a)是可以的,因为InnoDB将动态地只分配该文本列所需的空间,对吗?是否有任何理由选择(b)项?看起来选项(b)只会增加查询(连接)这些表的复杂性,并进一步增加空间复杂性。

MySQL(InnoDB存储引擎)不存储空值。嗯,每行有一个位字段,每个可为空的列有1位。位字段后面是非空列的数据值。而可变长度列(如VARCHAR、TEXT、BLOB或JSON)只占用给定长度所需的空间

因此,我建议保持表的原样,保持表中的文本字段,并在没有JSON数据时将其设为NULL


附言:您不是在使用吗?

您提到了存储/空间方面的考虑。我认为最重要的是你将如何使用这些数据。如果您对执行类似“%%”的匹配表示满意,那么就不做了


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

通常,无论您是执行(a)还是(b)操作都无关紧要。但这里还有一些其他注意事项:

  • 如果您选择了*但忽略了该列,那么(a)是浪费
  • 某些InnoDB
    ROW_格式
    会将“short”字符串放在表中,而不是单独的;其他的会将它们存储在单独的块中,在主块中留下20或767个字节。(看看这是否真的对(a)有影响,这会变得相当乏味和混乱。)
  • (b)在您需要该列时,在代码中包含<代码>左联接< /代码>。您可能认为这很麻烦。
确保声明列为可空,然后(a)就可以了。我明白了。我们不使用JSON数据类型,因为将来,我们可能会使用不同的数据格式,例如熊猫数据帧,所以我们不想将列与任何特定类型绑定。感谢与此相对应的是。