2013-02-08 110 views
4

運行本地Mysql實例。在我的數據庫中,我拼錯了一個列名(延伸到街道)。所以我寫了一個查詢:MySQL更改EMPTY表上的列名,需要很長時間

alter table address change Stret Street VARCHAR(20); 

該表剛創建幷包含零記錄。我知道有各種線索問爲什麼需要這麼長時間,但所有的表都有100,000多行。我一無所有!爲什麼這個查詢需要1小時13分15.76秒?

我知道我可以放棄並重新創建表格,我只是好奇爲什麼這個「簡單」的改變可能需要這麼長時間?

編輯:找到原因。我正在調試一個使用這個數據庫的程序,並在中間停止(不終止程序)來更改列名。一旦我停止了tomcat,一切都是即時的。所以大概這張表被鎖定了,所以查詢被阻止了。我正在使用InnoDB。感謝大家。

+0

什麼是您使用的DBEngine? InnoDB,MyIsam ...?另外,整個數據庫有多大? – Muc 2013-02-08 19:27:07

+0

服務器日誌中的任何內容?什麼版本的MySQL?什麼O/S和文件系統? – eggyal 2013-02-08 19:28:11

+3

也許表被鎖定?你能重現它,並仔細觀察它嗎? – 2013-02-08 19:29:02

回答

2

你這樣做之前,你可能想TRUNCATE TABLE address(速度非常快,但會重置您的AUTO_INCREMENT列計數器)或OPTIMIZE TABLE address(慢一點,但不改變數據),以沖洗掉任何遺留的數據是已刪除但未從數據庫中清除。

另一種方法是對CREATE TABLE _address LIKE address,對克隆進行更改,然後使用RENAME TABLE_address切換爲address

2

docs

報價在多數情況下,ALTER TABLE使得原本 表的臨時副本。 MySQL等待其他正在修改該表的操作,然後繼續執行。 。它將修改合併到副本中,刪除原始表格 ,並重命名新的表格。

如果你正使用InnoDB,它上面的甚至單列重命名,同時與MyISAM,它不會創建一個副本,並修改表的frm文件。 這將解釋由於內存限制,大型表格可能需要花費的時間。

您可以嘗試獲得query execution-plan