【问题标题】:MySQL add column without adding any physical data / increasing storage usage?MySQL 添加列而不添加任何物理数据/增加存储使用量?
【发布时间】:2017-07-19 23:36:51
【问题描述】:

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

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

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

【问题讨论】:

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

标签: mysql alter-table tablecolumn disk-access


【解决方案1】:

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

如果你将一个字段设置为非空,它将在 MyISAM 中占用更少的空间。

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

【讨论】:

    【解决方案2】:

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

    In theory:

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

    在实践中:

    • 添加新列会导致表重新构建,这在大多数情况下会导致数据被整理碎片,从而占用比以前更少的磁盘空间,但是 YMMV

    【讨论】:

      猜你喜欢
      • 2014-05-31
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2018-11-18
      相关资源
      最近更新 更多