2011-11-18 39 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 –

相關問題