在线 DDL 功能支持即时和就地表更改以及并发 DML。此功能的优势包括:
在繁忙的生产环境中提高了响应能力和可用性,在这些环境中,使表在几分钟或几小时内不可用是不切实际的。
对于就地操作,能够使用
LOCK
子句在 DDL 操作期间调整性能和并发性之间的平衡。请参阅 LOCK 子句。与表复制方法相比,磁盘空间使用量和 I/O 开销更少。
通常,您无需执行任何特殊操作即可启用在线 DDL。默认情况下,MySQL 会尽可能少地锁定,并根据允许立即或就地执行操作。
您可以使用 ALTER TABLE
语句的 ALGORITHM
和 LOCK
子句来控制 DDL 操作的各个方面。这些子句放在语句的末尾,并用逗号与表和列规范分开。例如:
ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE;
LOCK
子句可用于就地执行的操作,并且可用于微调操作期间对表的并发访问程度。对于立即执行的操作,仅支持 LOCK=DEFAULT
。ALGORITHM
子句主要用于性能比较,并在您遇到任何问题时用作旧表复制行为的备用方案。例如:
为了避免在就地
ALTER TABLE
操作期间意外地使表无法读取、写入或同时进行读取和写入,请在ALTER TABLE
语句上指定一个子句,例如LOCK=NONE
(允许读取和写入)或LOCK=SHARED
(允许读取)。如果请求的并发级别不可用,则操作将立即停止。要比较算法之间的性能,请使用
ALGORITHM=INSTANT
、ALGORITHM=INPLACE
和ALGORITHM=COPY
运行语句。您还可以使用启用了old_alter_table
配置选项的语句来强制使用ALGORITHM=COPY
。为了避免使用复制表的
ALTER TABLE
操作占用服务器,请包含ALGORITHM=INSTANT
或ALGORITHM=INPLACE
。如果无法使用指定的算法,则该语句将立即停止。