Mysql列的空值-需要多少空间?

Mysql列的空值-需要多少空间?,mysql,null,storage,requirements,Mysql,Null,Storage,Requirements,我有一张有很多条目的表格。 我需要一个带有整数值或null的附加列。 问题是只有很少几行会填充该字段 因此,我想知道是否最好创建一个单独的表,在其中以1:1的关系链接条目 我知道在mysql/myisam中,一个整数条目需要4个字节。如果我将列设置为允许空值,并且100000行中只有100行填充了字段,那么其余的行是否仍会为每个空值消耗4字节 或者mysql是否足够智能,可以在填充的位置设置值,并将所有内容都视为null,而不设置任何内容?据我所知,一旦将字段声明为int,将为其留出4个字节。因

我有一张有很多条目的表格。 我需要一个带有整数值或null的附加列。 问题是只有很少几行会填充该字段

因此,我想知道是否最好创建一个单独的表,在其中以1:1的关系链接条目

我知道在mysql/myisam中,一个整数条目需要4个字节。如果我将列设置为允许空值,并且100000行中只有100行填充了字段,那么其余的行是否仍会为每个空值消耗4字节


或者mysql是否足够智能,可以在填充的位置设置值,并将所有内容都视为null,而不设置任何内容?

据我所知,一旦将字段声明为int,将为其留出4个字节。因此,对于100000行,您将看到约400KB的空间


如果空间是一个约束,那么单独的表会更好。另一方面,如果性能是一个标准,那么您必须考虑该字段被查询的次数,以及是否检查该字段是否存在。无论哪种情况,您都需要加入。如果要检查字段是否已设置,可以使用内部联接,这将比单表查询慢。如果要检查是否不存在,则需要左/右外部联接,这将比内部联接慢。

这取决于创建表时给出的行格式值

在版本5.0.3之前,默认格式设置为“冗余”:任何固定长度字段将使用相同的空格,即使其值为空

从版本5.0.3开始,该值设置为“COMPACT”:空值将永远不会使用数据库中的任何空间

您可以更改表格,以确保使用正确的格式:

ALTER TABLE ... ROW_FORMAT=COMPACT
详情如下:

它将使用位字段存储空值,因此可能需要少于一个字节。但是,即使它这样做了——谁在乎呢,除非您使用3.5英寸的软盘来存储后端;-)


怎么可能使用零空间来存储空值呢?这需要付出一些代价。如果不可能记住这些值。@nate c…那么只存储数据,每个没有相应部分的数据都是隐式空值,该链接中没有任何内容说明空值是如何存储的。如果我在其中存储6列int,则es是33,44,66三列隐式为空。它们是哪三列?这是零存储。至少您需要一个位字段来告诉哪些列存在,哪些不存在。