将MySQL列值设置为NULL而不是0或''的磁盘空间含义

时间:2012-11-03 09:28:47

标签: mysql database

我正在尝试了解处理磁盘空间索引性能方面几乎为空的列的最佳方法。放入所有空位NULL和''(对于varchar / text)与0(对于int)之间是否有区别。

感谢。

3 个答案:

答案 0 :(得分:10)

不,使用NULL不会占用比空VARCHARINT字段更少的空间。事实上,它可能占用更多空间。原因如下:

VARCHAR存储为大小+值。用于大小的字节数取决于VARCHAR的最大存储空间。 VARCHAR(255)需要一个字节,VARCHAR(65536)需要两个字节,依此类推。

即使存储空字符串,VARCHAR(255)列也会占用一个字节。下表每行至少需要一个字节(加上一些其他可能的开销,具体取决于存储引擎)。

CREATE TABLE sample (
  a VARCHAR(255) NOT NULL
);

为了保存NULL值,MySQL对每一行使用位掩码。每个字节最多可存储8个可空列。所以如果你有这样的表:

CREATE TABLE sample (
  a VARCHAR(255) NULL
);

每行至少需要两个字节。存储NULL只会设置该位,无论您是否使用它,它都已被保留。即使该列设置为VARCHARNULL大小的字节仍会用于每一行。

答案 1 :(得分:0)

简单的答案可能是(尽管它无关紧要),空值可能占用较少的磁盘空间,但节省的空间可能很小(尽管即使很小的节省也会增加)。 除非磁盘空间受到严格限制,否则我不担心它(磁盘空间比程序员时间便宜很多) 此外,null和0(或'')在语义上是不同的,因此不应互换使用,当然不能用于理论(或非常小)的性能增益。

有关详细信息,请参阅this question

我认为索引不会受到太大影响,可能会有轻微的速度提升 有关详细信息,请参阅this question

This question专门处理MySQL和null性能。

答案 2 :(得分:0)

取决于。

如果你有一个固定宽度的表格(没有VARCHARVARBINARYBLOBTEXT),它可能没什么区别。

在可变宽度表中,NULL可能会消耗与空VARCHAR一样多的空间。

如果您拥有几乎所有值NULL并且只有极少数值包含数据,则可以创建一个您加入的单独表格。

因此,我们假设您有一份人员名单,其中只有少数人有生日。

所以而不是

CREATE TABLE people (id INT UNSIGNED NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(60) NOT NULL, birthday DATE)

你可以做到

CREATE TABLE people (id INT UNSIGNED NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(60) NOT NULL)
CREATE TABLE birthdates (id INT UNSIGNED, birthday DATE NOT NULL)

并使用LEFT JOIN查询数据。

如果有应用程序需要以旧格式访问该表,您可以定义一个视图。