我有一个必须添加一列的大表(数十万条记录)。该列仅存储布尔值(tinyint 0/1)。
目标是避免对已经存在的记录使用额外的存储空间,因为默认情况下它们将具有 NULL/0 并且将来可以设置 1,但不是全部,当然也不是一次全部。
那么NULL会占用一些存储空间吗?或者添加一个可以为 NULL 的列是否会将任何物理数据添加到现有行?
我有一个必须添加一列的大表(数十万条记录)。该列仅存储布尔值(tinyint 0/1)。
目标是避免对已经存在的记录使用额外的存储空间,因为默认情况下它们将具有 NULL/0 并且将来可以设置 1,但不是全部,当然也不是一次全部。
那么NULL会占用一些存储空间吗?或者添加一个可以为 NULL 的列是否会将任何物理数据添加到现有行?
Johan 回答了这个关于“MySQL:NULL 字段使用多少空间? ”的问题。
如果您将字段设置为非空,它将在 MyISAM 中占用更少的空间。
将其设置为接受 null 将使其在 MyISAM 中占用更多空间。
在 InnoDB 中,空值占用的空间更少,因此它可能在那里工作。
在他的回答中,提供创建新表而不是为您的大表添加新列:
另一种选择是不将该字段添加到此表中,而是执行
table extra_data id integer primary key big_table_id integer large_data_seldom_used varchar(65000)
如果您需要选择额外数据,请执行以下操作:
SELECT large_data_seldom_used FROM bigtable b INNER JOIN extra_data e ON (e.big_table_id = b.id)
这样,您根本不必在 bigtable 中添加额外的字段,如果 extra_field 很少使用,则可以节省大量空间。
(我假设您使用的是 InnoDB 存储引擎和 COMPACT 行格式)
理论上:
在实践中: