2017-02-28 36 views
0

我有这个大表(数十万条记录)必须添加一列。该列仅存储布尔值(tinyint 0/1)。MySQL添加列而不添加任何物理数据/增加存储使用量?

目标是避免额外存储使用已存在的记录,因为它们将默认为NULL/0,将来可以设置为1,但不是一次也不是全部。

那么NULL是否需要一些存储空间?或者将添加一个NULL-capable列添加任何物理数据到现有的行?

+0

你使用什么存储引擎和行格式?您可以通过查询information_schema来查看:'select engine,row_format from information_schema.tables where table_schema ='your_schema'and table_name ='your_table';' –

+0

@IkeWalker MyISAM,dynamic(我无法影响这些设置) –

+0

创建新表存储新描述的列是最好的方式(据我所知!)和JOIN与大表使用。有人建议我在答复中提到过。 @ jave.web – MohaMad

回答

0

约翰回答到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很少使用,就可以节省大量空间。

0

(我假设你正在使用InnoDB存储引擎以及紧凑的行格式)

In theory

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

在实践中:

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