基于稀疏列的MySQL数据库设计
我有一个表(数百万行),其中一列是文本字段(存储json blob)。但实际上只有10-20%是非空的。 对于稀疏列,最佳做法是什么? 我应该吗 a) 保持桌子原样就行了 b) 是否仅使用该文本列创建新表 如果我没有弄错的话,选项(a)是可以的,因为InnoDB将动态地只分配该文本列所需的空间,对吗?是否有任何理由选择(b)项?看起来选项(b)只会增加查询(连接)这些表的复杂性,并进一步增加空间复杂性。MySQL(InnoDB存储引擎)不存储空值。嗯,每行有一个位字段,每个可为空的列有1位。位字段后面是非空列的数据值。而可变长度列(如VARCHAR、TEXT、BLOB或JSON)只占用给定长度所需的空间 因此,我建议保持表的原样,保持表中的文本字段,并在没有JSON数据时将其设为NULL基于稀疏列的MySQL数据库设计,mysql,database,database-design,Mysql,Database,Database Design,我有一个表(数百万行),其中一列是文本字段(存储json blob)。但实际上只有10-20%是非空的。 对于稀疏列,最佳做法是什么? 我应该吗 a) 保持桌子原样就行了 b) 是否仅使用该文本列创建新表 如果我没有弄错的话,选项(a)是可以的,因为InnoDB将动态地只分配该文本列所需的空间,对吗?是否有任何理由选择(b)项?看起来选项(b)只会增加查询(连接)这些表的复杂性,并进一步增加空间复杂性。MySQL(InnoDB存储引擎)不存储空值。嗯,每行有一个位字段,每个可为空的列有1位。位字
附言:您不是在使用吗?您提到了存储/空间方面的考虑。我认为最重要的是你将如何使用这些数据。如果您对执行类似“%%”的匹配表示满意,那么就不做了
对数据进行非规范化可以让您更好地查询/索引内容。通常,无论您是执行(a)还是(b)操作都无关紧要。但这里还有一些其他注意事项:
- 如果您选择了*但忽略了该列,那么(a)是浪费
- 某些InnoDB
会将“short”字符串放在表中,而不是单独的;其他的会将它们存储在单独的块中,在主块中留下20或767个字节。(看看这是否真的对(a)有影响,这会变得相当乏味和混乱。)ROW_格式