MySQL 8.4 版本注意事項
在引入線上 DDL之前,常見的做法是將許多 DDL 操作合併到單個 ALTER TABLE
語句中。由於每個 ALTER TABLE
語句都涉及複製和重建資料表,因此一次對同一資料表進行多項變更會更有效率,因為這些變更都可以通過單個資料表重建操作完成。缺點是涉及 DDL 操作的 SQL 程式碼更難以維護和在不同的腳本中重複使用。如果每次的具體變更都不同,您可能必須為每個略有不同的情境建構一個新的複雜 ALTER TABLE
。
對於可以在線上完成的 DDL 操作,您可以將其分成單獨的 ALTER TABLE
語句,以便更輕鬆地進行腳本編寫和維護,而不會犧牲效率。例如,您可以採用如下複雜的語句
ALTER TABLE t1 ADD INDEX i1(c1), ADD UNIQUE INDEX i2(c2),
CHANGE c4_old_name c4_new_name INTEGER UNSIGNED;
並將其分解為可以獨立測試和執行的較簡單部分,例如
ALTER TABLE t1 ADD INDEX i1(c1);
ALTER TABLE t1 ADD UNIQUE INDEX i2(c2);
ALTER TABLE t1 CHANGE c4_old_name c4_new_name INTEGER UNSIGNED NOT NULL;
您可能仍然會使用多部分的 ALTER TABLE
語句來處理
必須按特定順序執行的操作,例如建立索引,然後建立使用該索引的外鍵約束。
所有都使用相同的特定
LOCK
子句的操作,您希望它們作為一個群組成功或失敗。無法在線上執行的操作,也就是說,仍然使用資料表複製方法的操作。
指定
ALGORITHM=COPY
或old_alter_table=1
的操作,會在需要為特定情境提供精確回溯相容性時,強制執行資料表複製行為。