MySQL添加列而不添加任何物理数据/增加存储使用量?

时间:2017-02-28 20:35:06

标签: mysql alter-table tablecolumn diskusage

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

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

NULL也需要一些存储空间吗?或者添加一个支持NULL的列将任何物理数据添加到现有行?

2 个答案:

答案 0 :(得分:0)

Johan回复this Question关于" MySQL: NULL字段使用了多少空间?"

  

如果将字段设置为非空,则MyISAM将占用更少的空间。

     

将其设置为接受null将使其在MyISAM中占用更多空间。

     

在InnoDB中,null值占用的空间更少,因此它可以在那里工作。

在他的回答中,提出创建新表而不是为你的大表添加新列:

  

另一种选择是将字段添加到此表中,但要执行

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

答案 1 :(得分:0)

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

<强> In theory

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

在实践中:

  • 添加新列将导致重建表,这在大多数情况下会导致数据进行碎片整理,使其占用的磁盘空间比以前少,但是YMMV