我有这个大表(数十万条记录)必须添加一列。该列仅存储布尔值(tinyint 0/1)。MySQL添加列而不添加任何物理数据/增加存储使用量?
目标是避免额外存储使用已存在的记录,因为它们将默认为NULL/0,将来可以设置为1,但不是一次也不是全部。
那么NULL是否需要一些存储空间?或者将添加一个NULL-capable列添加任何物理数据到现有的行?
我有这个大表(数十万条记录)必须添加一列。该列仅存储布尔值(tinyint 0/1)。MySQL添加列而不添加任何物理数据/增加存储使用量?
目标是避免额外存储使用已存在的记录,因为它们将默认为NULL/0,将来可以设置为1,但不是一次也不是全部。
那么NULL是否需要一些存储空间?或者将添加一个NULL-capable列添加任何物理数据到现有的行?
约翰回答到this Question约“MySQL的:多少空间做一个NULL字段使用”
在他的回答如果将某个字段设置为NOT NULL将采取在MyISAM中更小的空间。
将其设置为接受空值会使其在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存储引擎以及紧凑的行格式)
在实践中:
你使用什么存储引擎和行格式?您可以通过查询information_schema来查看:'select engine,row_format from information_schema.tables where table_schema ='your_schema'and table_name ='your_table';' –
@IkeWalker MyISAM,dynamic(我无法影响这些设置) –
创建新表存储新描述的列是最好的方式(据我所知!)和JOIN与大表使用。有人建议我在答复中提到过。 @ jave.web – MohaMad