10

我试图了解处理在磁盘空间索引性能方面大部分为空的列的最佳方法。在所有空的地方 NULL 与 '' (对于 varchar / text)和 0 (对于 int)之间有区别吗?

谢谢。

4

3 回答 3

17

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

AVARCHAR存储为大小 + 值。用于大小的字节数取决于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只是设置位,无论您使用与否,它都已保留。VARCHAR即使列设置为 ,每一行仍使用 的大小字节NULL

于 2012-11-03T10:00:45.627 回答
1

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

有关更多详细信息,请参阅此问题

我不认为索引会受到很大影响,可能会有轻微的速度提升。
有关更多详细信息,请参阅此问题

这个问题专门处理 MySQL 和 null 性能。

于 2012-11-03T09:41:10.387 回答
0

这取决于。

如果您有一个固定宽度的表格(没有VARCHAR、或) VARBINARY,它可能没有任何区别。BLOBTEXT

在可变宽度表中, aNULL可能会占用与 empty 一样多的空间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 查询数据。

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

于 2012-11-03T10:03:21.703 回答