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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL的表现ALTER TABLE在列之后添加列 - 在一张大桌子上相关的知识,希望对你有一定的参考价值。

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

   ALTER TABLE foo ADD COLUMN bar AFTER COLUMN old_column;

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

   ALTER TABLE foo ADD COLUMN bar;

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

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

答案

这就是我要做的事情:

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;
另一答案

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

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

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


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

以上是关于MySQL的表现ALTER TABLE在列之后添加列 - 在一张大桌子上的主要内容,如果未能解决你的问题,请参考以下文章

使用 Alter Table 和现有 MYSQL 数据库添加外键时出现问题 - 无法添加!帮助!

mysql alter table修改表命令整理

mysql对字段的操作

ALTER TABLE 添加复合主键

MySQL 语句大全--------添加列,修改列,删除列

MySQL 操作已存在的表(ALTER TABLE)