Mysql

“更改表”在 INNODB 中修改多個列與多個更改表單列?

  • December 9, 2020

我正在將我的數據庫表和列的排序規則從 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).

引用自:https://dba.stackexchange.com/questions/281087