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 KEYS
和ALTER 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在列之后添加列 - 在一张大桌子上的主要内容,如果未能解决你的问题,请参考以下文章