0

我有一个必须添加一列的大表(数十万条记录)。该列仅存储布尔值(tinyint 0/1)。

目标是避免对已经存在的记录使用额外的存储空间,因为默认情况下它们将具有 NULL/0 并且将来可以设置 1,但不是全部,当然也不是一次全部。

那么NULL会占用一些存储空间吗?或者添加一个可以为 NULL 的列是否会将任何物理数据添加到现有行?

4

2 回答 2

0

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 很少使用,则可以节省大量空间。

于 2017-02-28T21:26:38.723 回答
0

(我假设您使用的是 InnoDB 存储引擎和 COMPACT 行格式)

理论上

  • NULL 值将在记录头中的 NULL 位向量中分别占用 1 位存储空间
  • 非 NULL 值将分别占用 1 个字节的存储空间

在实践中:

  • 添加新列会导致表被重建,这在大多数情况下会导致数据被碎片整理,从而占用比以前更少的磁盘空间,但是 YMMV
于 2017-02-28T21:35:11.853 回答