MySQL添加列而不添加任何物理数据/增加存储使用率?
我有一个大表(数十万条记录),其中必须添加一列。该列仅存储布尔值(tinyint 0/1) 我们的目标是避免对现有记录使用额外的存储空间,因为默认情况下,这些记录将具有NULL/0,并且可以在将来设置1,但不能同时为所有记录设置1,当然也不能同时为所有记录设置1 那么NULL会占用一些存储空间吗?或者添加一个可以为空的列是否会将任何物理数据添加到现有行?Johan回答了关于“MySQL:空字段使用多少空间?”的问题 如果您将一个字段设置为NOTNULL,它将占用MyISAM中更少的空间 将其设置为accept null将使其在MyISAM中占用更多空间 在InnoDB中,空值占用更少的空间,因此它可能在那里工作 在他的回答中,他提出创建新表,而不是为大表添加新列: 另一个选项是不将字段添加到此表中,而是执行以下操作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中更少的空间 将其设置
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字节的存储空间
- 添加新列将导致重建表,在大多数情况下,这将导致对数据进行碎片整理,使其占用的磁盘空间比以前少,但是
select engine,row_format from information_schema.tables,其中table_schema='your_schema'和table_name='your_table'代码>@IkeWalker MyISAM,动态(我不能影响这些设置)创建新表来存储新描述的列是最好的方法(我知道!),并与大表结合使用。这是我在回答中提到的某个人提出的@jave.web