mysql – 为什么我更喜欢ALGORITHM = COPY到ALGORITHM = INPLACE?
作者:互联网
由于MySQL 5.6引入了在线DDL,因此ALTER TABLE
命令可以选择指定ALGORITHM = INPLACE或ALGORITHM = COPY. overview of online DDL指出,默认情况下,尽可能使用INPLACE,并暗示(没有说明)INPLACE算法比COPY算法便宜.
那么我有什么理由在ALTER TABLE语句中指定ALGORITHM = COPY?
解决方法:
是的,有些情况下您可以指定COPY,但这可能是出于其他原因而不是性能.
重要的是要了解MySQL引入了新功能 – 5.6版中的在线DLL处理.它没有删除脱机处理.因此需要区分这两种模式:
>某些操作仍然只能在脱机模式下工作.有关可以或不可以就地执行的DDL操作的列表,请参见表15.10“Summary of Online Status for DDL Operations”.
>在线和离线模式下的操作行为略有不同,因此出于兼容性原因,您可以选择“旧”模式.
一些例子(请建议更多):
>在MySQL 5.6之前创建的InnoDB表不支持ALTER TABLE … ALGORITHM = INPLACE用于包含时间列(DATE,DATETIME或TIMESTAMP)的表,并且尚未使用ALTER TABLE … ALGORITHM = COPY重建.在这种情况下,ALTER TABLE … ALGORITHM = INPLACE操作返回错误.
COPY模式下的ADD PRIMARY KEY子句以静默方式将NULL转换为该数据类型的默认值(对于INT为0,对于varchar为空字符串),而IN_PLACE不会这样做.
With the ALGORITHM=COPY clause, the operation succeeds despite the
presence of NULL values in the primary key columns; the data is
silently changed, which could cause problems.
更喜欢COPY的另一个原因:
Operations for which you specify ALGORITHM=COPY or old_alter_table=1,
to force the table-copying behavior if needed for precise
backward-compatibility in specialized scenarios.
虽然MySQL手册没有谈到实际场景,但你可以想象一些.例如.开发人员在ALTER INDEX操作期间依赖于表被锁定,因此表是只读的或完全锁定的,并且有一个进程在索引重建期间读取静态表.
标签:mysql,ddl,alter-table,online-operations 来源: https://codeday.me/bug/20190805/1589241.html