14.13.4 使用在线 DDL 简化 DDL 语句

在引入online DDL之前,通常的做法是将许多 DDL 操作合并为一个ALTER TABLE语句。因为每个ALTER TABLE语句都涉及复制和重建 table,所以一次对同一个 table 进行多次更改会更有效,因为这些更改都可以通过对该 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;

您可能仍将 MultipartALTER TABLE语句用于:

  • 必须按特定 Sequences 执行的操作,例如创建索引,后跟使用该索引的外键约束。

  • 所有操作都使用您要成组或失败的相同的特定LOCK子句。

  • 无法执行的操作,即仍使用 table 复制方法的操作。

  • 您指定了ALGORITHM=COPYold_alter_table=1的操作,以便在特殊情况下为实现精确的向后兼容性而需要强制执行 table 复制行为。