2011-11-18 470 views
27

我想达到以下使用下面的命令列添加到现有表:性能MySQL的ALTER TABLE的ADD COLUMN列之后 - 在一个大桌子

ALTER TABLE foo ADD COLUMN bar AFTER COLUMN old_column; 

此选项将花费更多的时间比没有AFTER COLUMN选项的同样的命令,如下所示?

ALTER TABLE foo ADD COLUMN bar; 

第一个命令会在执行过程中使用更多的tmp表空间来执行操作吗?

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

+0

是不断读表吗?它是一个合并表? –

+0

这是一个常规的桌子。阅读数据没有问题。 – Drew

+0

这个表是用在很多mysql程序中的吗? php代码? (或其他代码)? –

回答

2

虽然如将列添加到一个表所需的语法的例子中,答案的实际问题是由NB提供的其他的答案是有用的:


由于记录必须移位,因此您会获得更多的CPU使用量。

内存使用的角度来看 - 它会是相同的与AFTER COLUMN选项,没有它。

在大多数情况下,创建一个tmp表。有MySQL的引擎,支持热插拔架构更改(TokuDB是一个)不创建TMP表和浪费吨的资源。

但是,如果您使用MyISAM或InnoDB进行此操作 - 由于记录切换,我会说“后列”选项会稍微花费更多的时间。

- 注:

+0

可以有一些官方文件链接来确认吗? – zhuguowei

36

这里是我会做:

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; 
+0

对不起,你是对的,我更新了我的anwer –

+1

这将是一个很好的替代解决方案。只是为了分享:对于任何为这些非常大型的表使用此方法的人,还请检查受影响的表中正在用作其他表中的外键的任何列。你将不得不重置这些。 – Nonym

+1

我不明白这和MySQL的内部方式有何不同,如此处所述(http://dev.mysql.com/doc/refman/5.0/en /alter-table-problems.html)。那么,你不会做重命名的步骤。此外,这种方法不考虑oldtable上具有外键的表,因此如果它们确实存在,您将无法删除旧表。有了这个问题,我认为答案应该不存在。 – mangoDrunk

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; 
+3

如果你这样做,不要忘记优化你的表后 –

+0

@BookOfZeus此时'优化表'的目的是什么? – lqez

+1

我不能解释它比这更好:http://dev.mysql.com/doc/refman/5.1/en/optimize-table.html –

相关问题