首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我会更喜欢ALGORITHM=COPY而不是ALGORITHM=INPLACE?

为什么我会更喜欢ALGORITHM=COPY而不是ALGORITHM=INPLACE?
EN

Database Administration用户
提问于 2017-01-12 17:32:26
回答 3查看 26.3K关注 0票数 28

由于MySQL 5.6引入了联机DDL,所以ALTER TABLE命令可以选择指定ALGORITHM=INPLACEALGORITHM=COPY在线DDL概述指出,默认情况下,在可能的情况下使用INPLACE,并暗示INPLACE算法比COPY算法便宜。

那么,我需要在ALGORITHM=COPY语句上指定ALTER TABLE的原因是什么呢?

EN

回答 3

Database Administration用户

发布于 2017-01-27 10:07:03

是的,在某些情况下,您可以指定COPY,但这是出于性能以外的其他原因。

重要的是要理解MySQL在版本5.6中引入了新的特性-联机DLL处理。它没有删除脱机处理。因此,有必要区分这两种模式:

  1. 有些操作仍然只在脱机模式下工作。有关可以或不能就地执行的DDL操作的列表,请参见表15.10“DDL操作在线状态摘要”。
  2. 联机模式和脱机模式下的操作行为略有不同,因此出于兼容性原因,您可以选择“旧”操作。

一些例子(请提出更多建议):

  1. 在InnoDB 5.6之前创建的MySQL表不支持包含时态列(DATEDATETIMETIMESTAMP)且尚未使用ALTER TABLE ... ALGORITHM=COPY重新构建的表的ALTER TABLE ... ALGORITHM=INPLACE。在这种情况下,ALTER TABLE ... ALGORITHM=INPLACE操作返回错误。
  2. ADD PRIMARY KEY子句在COPY mode中静默地将NULL转换为该数据类型的默认值( INT为0,varchar为空字符串),而IN_PLACE则不这样做。

使用ALGORITHM=COPY子句,操作成功,尽管主键列中存在空值;数据被静默更改,这可能会导致问题。

选择COPY的另一个原因是:

为其指定ALGORITHM=COPY或old_alter_table=1的操作,以便强制表复制行为(如果需要的话),以便在特定场景中实现精确的向后兼容性。

虽然MySQL手册没有讨论实际的场景,但您可以想象一些情况。例如,开发人员依赖于在ALTER INDEX操作期间被锁定的表,因此表是只读的或完全锁定的,并且在索引重建期间有一个读取静态表的进程。

票数 24
EN

Database Administration用户

发布于 2017-01-29 05:45:43

@Stoleg可能有最好的答案,但这里有另一个答案。这是一个有根据的猜测,开发人员把=COPY作为一个逃生舱口,以防=INLINE中出现严重的漏洞。这将允许用户继续使用ALTER,即使新功能被破坏了。

这些年来,我已经看到了类似的事情(在旗帜、sql_modemy.cnf设置等方面)。新版本的目的显然是推出新的、更好的特性。

优化标志属于这一类,但是有更多的理由坚持以前的操作--优化器有时总是“做错了”,只是有太多的可能性。

票数 3
EN

Database Administration用户

发布于 2018-04-26 17:25:07

在支持MySQL表空间加密的InnoDB版本中,当您更改表以添加加密时,出于必要,将使用复制算法进行更改。

票数 -1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/160891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档