“更改表”在 INNODB 中修改多個列與多個更改表單列?
我正在將我的數據庫表和列的排序規則從 utf8bin 更新為 utf8mb4_bin。引擎是 INNODB,啟用了每個表的文件。
我使用查詢從 information_schema 數據庫中生成標識所有 utf8 列,並為每個列生成相應的查詢。
生成的查詢分別包含每個列的“ALTER TABLE”查詢。
例子:
ALTER TABLE mydb.`cwd_group` MODIFY `active` char CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL; ALTER TABLE mydb.`cwd_group` MODIFY `local` char CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL;
是否建議將這兩個作為一個聲明加入?會有什麼弊端?
ALTER TABLE mydb.`cwd_group` MODIFY `active` char CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL ,MODIFY `local` char CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL ;
我猜測通過將它們作為單個語句加入,磁碟 IO 會減少,因為它不需要多次寫入整個表數據(即,寫入臨時 ibd 文件#sql-*)還是只將列數據寫入臨時文件?或者如果我合併語句,它可以為臨時文件使用多少額外空間?
最後,我想並行執行我的伺服器可以處理的這些更改表。
您必須在一個 ALTER TABLE 命令中完成所有操作。想一想:您正在更改列的排序規則,因此必須執行 ALGORITHM=COPY。這需要全表鎖。最好在單個 ALTER TABLE 命令中執行多列的排序規則更改,而不是多次執行
在這種情況下沒有缺點。為什麼 ?回過頭來
May 12, 2011
,我寫了關於 MySQL 5.0 在執行多列修改時的舊行為(MySQL 仍然以這種方式處理索引嗎?)。在底層,MySQL 曾經將多個列更改作為單獨的 ALTER TABLE 命令執行。我再次向 MySQL 指出了這一點Oct 10, 2006
。從那以後他們就修好了。現在 ALTER TABLE 將多個列更改作為單個操作處理,因此無需一一更改列。
假設更改一列需要 5 分鐘。那是表被鎖定的 5 分鐘,並且不會發生 INSERT、UPDATE 或 DELETE。您基本上會將兩列更改為 10 分鐘的時間增加一倍,將三列更改為 15 分鐘的時間增加三倍,依此類推。
只需執行一個 ALTER TABLE 命令。MySQL 現在可以正確處理它。
ALTER TABLE mydb.`cwd_group` MODIFY `active` char(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL ,MODIFY `local` char(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL ;
試試看 !!!
PS您需要為
char
. 這就是為什麼我把(25)
.如果您不確定長度,請使用
VARCHAR(25)
.