我试图了解处理在磁盘空间和索引性能方面大部分为空的列的最佳方法。在所有空的地方 NULL 与 '' (对于 varchar / text)和 0 (对于 int)之间有区别吗?
谢谢。
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
。
这取决于。
如果您有一个固定宽度的表格(没有VARCHAR
、或) VARBINARY
,它可能没有任何区别。BLOB
TEXT
在可变宽度表中, 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 查询数据。
如果有应用程序需要以旧格式访问表,您可以定义一个视图。