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

时间:2011-11-18 23:04:19

标签: mysql

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

   ALTER TABLE foo ADD COLUMN bar AFTER COLUMN old_column;

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

   ALTER TABLE foo ADD COLUMN bar;

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

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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:11)

创建另一个表并更改新表。 (就像Book of Zeus所做的那样)

在插入查询之前和之后使用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;

答案 2 :(得分:5)

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


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

    - N.B.