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

MySQL添加列而不添加任何物理数据/增加存储使用率?,mysql,alter-table,tablecolumn,disk-access,Mysql,Alter Table,Tablecolumn,Disk Access,我有一个大表(数十万条记录),其中必须添加一列。该列仅存储布尔值(tinyint 0/1) 我们的目标是避免对现有记录使用额外的存储空间,因为默认情况下,这些记录将具有NULL/0,并且可以在将来设置1,但不能同时为所有记录设置1,当然也不能同时为所有记录设置1 那么NULL会占用一些存储空间吗?或者添加一个可以为空的列是否会将任何物理数据添加到现有行?Johan回答了关于“MySQL:空字段使用多少空间?”的问题 如果您将一个字段设置为NOTNULL,它将占用MyISAM中更少的空间 将其设置

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

我们的目标是避免对现有记录使用额外的存储空间,因为默认情况下,这些记录将具有NULL/0,并且可以在将来设置1,但不能同时为所有记录设置1,当然也不能同时为所有记录设置1

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

Johan回答了关于“MySQL:空字段使用多少空间?”的问题

如果您将一个字段设置为NOTNULL,它将占用MyISAM中更少的空间

将其设置为accept 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添加额外的字段,如果很少使用额外的_字段,则可以节省大量空间

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

  • 空值在记录头的空位向量中各占用1位存储空间
  • 非空值将占用1字节的存储空间
实践中:

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

您使用的存储引擎和行格式是什么?您可以通过查询信息_schema来检查这一点:
select engine,row_format from information_schema.tables,其中table_schema='your_schema'和table_name='your_table'@IkeWalker MyISAM,动态(我不能影响这些设置)创建新表来存储新描述的列是最好的方法(我知道!),并与大表结合使用。这是我在回答中提到的某个人提出的@jave.web