MySQL的表现ALTER TABLE在列之后添加列 - 在一张大桌子上

问题描述 投票:28回答:3

我想实现以下使用以下命令将列添加到现有表:

   ALTER TABLE foo ADD COLUMN bar AFTER COLUMN old_column;

没有AFTER COLUMN选项,此选项是否比相同的命令长得多,如下所示?

   ALTER TABLE foo ADD COLUMN bar;

第一个命令会在执行期间使用更大量的tmp表空间来执行操作吗?

上下文:我有一个非常大的表(想想超过十亿行),我想使用AFTER COLUMN选项添加一个额外的列,但我不想受到太多惩罚。

mysql
3个回答
35
投票

这就是我要做的事情:

CREATE TABLE newtable LIKE oldtable;
ALTER TABLE newtable ADD COLUMN columnname INT(10) UNSIGNED NOT NULL DEFAULT 0; 

我不知道你的专栏的类型。我举一个INT的例子。现在,您可以在此处指定要添加此新列的位置。默认情况下,除非您指定AFTER关键字,否则它会在最后添加它,如果您提供它,则必须按顺序指定,否则您需要将其放在最后。

INSERT INTO newtable SELECT field1, field2, field3 /*etc...*/, newcolumn = 0 FROM oldtable; 

或者,如果您在列之间添加它:

# eg: ALTER TABLE newtable ADD COLUMN columnname INT(10) UNSIGNED  NULL AFTER field2; 
INSERT INTO newtable SELECT field1, field2, newcolumn = 0, field3 /*etc...*/ FROM oldtable; 

如果要批量执行,可以添加where子句。

一旦所有记录都在那里

DROP TABLE oldtable;
RENAME TABLE newtable to oldtable;

11
投票

创建另一个表并更改新表。 (像宙斯之书那样)

在插入查询之前和之后使用ALTER TABLE newtable DISABLE KEYSALTER TABLE newtable ENABLE KEYS可以使它更快。 (如下)

CREATE TABLE newtable ....;
ALTER TABLE newtable ....;

ALTER TABLE newtable DISABLE KEYS;
INSERT INTO newtable ....;
ALTER TABLE newtable ENABLE KEYS;

DROP TABLE oldtable;

5
投票

虽然其他答案对于将列添加到表所需的语法示例很有用,但实际问题的答案由N.B.提供:


  • 由于必须移动记录,因此您将获得更多的CPU使用率。
  • 从内存使用的角度来看 - 它与AFTER COLUMN选项相同,没有它。
  • 在大多数情况下,会创建一个tmp表。有一些MySQL引擎支持热模式更改(TokuDB是一个),它不会创建tmp表并浪费大量资源。
  • 但是,如果您使用MyISAM或InnoDB进行此操作 - 我会说“AFTER COLUMN”选项会因记录转移而花费更多时间。 - N.B.
© www.soinside.com 2019 - 2024. All rights reserved.