ALGORITHM mysql8.0新特性

ALTER TABLE 使用以下算法之一处理操作:

COPY:对原始表的副本执行操作,并将表数据从原始表逐行复制到新表。不允许并发DML。
INPLACE:操作可避免复制表数据,但可以在适当位置重建表。在操作的准备和执行阶段可以简短地获取表上的独占元数据锁定。通常,支持并发DML。
INSTANT:操作只能修改数据字典中的元数据。在准备和执行期间,不会在表上获取任何独占元数据锁,并且表数据不受影响,从而使操作立即进行。允许并发DML。(在MySQL 8.0.12中引入)

该ALGORITHM子句是可选的。如果ALGORITHM省略该 子句,则MySQL将使用 支持它的ALGORITHM=INSTANT存储引擎和 ALTER TABLE子句。否则,将ALGORITHM=INPLACE被使用。如果 ALGORITHM=INPLACE不支持, ALGORITHM=COPY则使用。
指定ALGORITHM子句要求操作将指定的算法用于支持子句的子句和存储引擎,否则将失败并显示错误。指定ALGORITHM=DEFAULT与省略ALGORITHM子句相同。

ALTER TABLE使用该 COPY算法的操作等待修改表的其他操作完成。将更改应用于表副本后,将数据复制过来,删除原始表,然后将表副本重命名为原始表的名称。ALTER TABLE 执行该操作时,其他会话可以读取原始表(不久后会注意到)。在ALTER TABLE操作开始之后开始的表的更新和写入将暂停,直到准备好新表,然后自动将其重定向到新表。该表的临时副本是在原始表的数据库目录中创建的,除非它是RENAME TO 将表移动到位于其他目录中的数据库的操作。

前面提到的例外是,ALTER TABLE在准备好从表和表定义高速缓存中清除过时的表结构时, 块读取(而不仅仅是写入)。在这一点上,它必须获得一个排他锁。为此,它等待当前的读取器完成,并阻止新的读取和写入。

ALTER TABLE使用该COPY算法 的操作可防止并发DML操作。仍然允许并发查询。也就是说,表复制操作始终至少包括的并发限制LOCK=SHARED(允许查询,但不包括DML)。您可以LOCK通过指定来进一步限制支持该子句的 操作的并发性LOCK=EXCLUSIVE,以防止DML和查询。有关更多信息,请参见 并发控制。

要强制将COPY算法用于ALTER TABLE原本不会使用的 操作,请指定ALGORITHM=COPY或启用old_alter_table系统变量。如果该old_alter_table设置与 ALGORITHM值不是 DEFAULT的ALGORITHM 子句之间存在冲突 ,则该子句优先。

对于InnoDB表,对驻留在共享表空间中的表ALTER TABLE使用COPY算法 的 操作 可能会增加表空间使用的空间量。此类操作需要与表中的数据以及索引一样多的额外空间。对于驻留在共享表空间中的表,操作期间使用的额外空间不会释放回操作系统,就像驻留在每个表文件表 空间中的表一样。

有关在线DDL操作的空间要求的信息,请参见 第15.12.3节“在线DDL空间要求”。

ALTER TABLE支持该INPLACE算法的操作包括:

ALTER TABLEInnoDB 在线DDL功能支持的操作 。请参见 第15.12.1节“在线DDL操作”。

重命名表。MySQL重命名与表相对应的文件,tbl_name但不进行复制。(您也可以使用该RENAME TABLE语句来重命名表。请参见 第13.1.36节“ RENAME TABLE语句”。)专为重命名表授予的特权不会迁移到新名称。必须手动更改它们。

仅修改表元数据的操作。由于服务器不触摸表内容,因此这些操作是立即进行的。仅元数据的操作包括:

重命名列。在NDB Cluster 8.0.18和更高版本中,也可以在线执行此操作。

更改列的默认值(NDB表除外 )。

只要数据类型的存储大小不变,就可以通过在有效成员值列表的末尾添加新的枚举或设置成员来 修改ENUMor或 SETcolumn的定义 。例如,将成员添加到具有8个成员的列中,将每个值所需的存储从1字节更改为2字节;这需要一个表副本。在列表中间添加成员会导致对现有成员重新编号,这需要表副本。 SET

更改空间列的定义以删除 SRID属性。(添加或更改 SRID属性确实需要重建,并且无法就地完成,因为服务器必须验证所有值均具有指定的SRID值。)

从MySQL 8.0.14开始,在满足以下条件时更改列字符集:

列数据类型是 CHAR, VARCHAR,一个 TEXT类型,或 ENUM。

字符集更改为从 utf8mb3到 utf8mb4,或任何字符集更改为 binary。

列上没有索引。

从MySQL 8.0.14开始,在满足以下条件时更改生成的列:

对于InnoDB表,这些语句将修改生成的存储列,但不更改其类型,表达式或可为空性。

对于非InnoDB表,这些语句修改已生成的存储列或虚拟列,但不更改其类型,表达式或可为空性。

此类更改的一个示例是对列注释的更改。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值