MySQL alter table…,是否有更明智的方式?

改表走钢丝?算法这把平衡木让你从容走天桥。

在上篇文章MySQL的字段扩容中,我们提到了一些情况下MySQL可能会重建表,所以为了避免不可预知的情况出现,我们建议每次修改时指定算法

CREATE TABLE `t_0322` (
  `id` bigint NOT NULL,
  `a` varchar(188DEFAULT NULL,
  `b` varchar(64DEFAULT NULL,
  PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

使用instant算法增加字段。

alter table t_0322 add c varchar(30), algorithm = instant;

那你肯定会产生疑问:”最近的版本不是加字段默认instant吗,只修改元数据,不会重建表,在秒级就可以完成啊“。

这是因为InnoDB有个限制:”一张表最多有64个instant列“。

比如我们继续加63个instant字段(刚才已经加了一个字段c)。然后再执行下面的脚本。

alter table t_0322 add c64 varchar(30), algorithm = instant;

此时报错

Error executing query:
SQL Error [4092] [HY000]: Maximum row versions reached for table amias/t_0322. No more columns can be added or dropped instantly. Please use COPY/INPLACE.

因此,我们无法再增加instant字段了,去掉后可以增加成功。

alter table t_0322 add c64 varchar(30);

此时,会重建表。

amias/ CREATE #sql-ib2581-1079464056.ibd
amias/ OPEN #sql-ib2581-1079464056.ibd
amias/ MODIFY #sql-ib2581-1079464056.ibd
amias/ MODIFY #sql-ib2581-1079464056.ibd
amias/ MODIFY #sql-ib2581-1079464056.ibd
amias/ MODIFY #sql-ib2581-1079464056.ibd
amias/ MODIFY #sql-ib2581-1079464056.ibd
amias/ OPEN #sql-ib2581-1079464056.ibd

包括其他字段修改,如果期待可预期的结果出现,最好加上algorithm

alter table t_0322 modify b varchar(80), algorithm = inplace, lock = none;


原文始发于微信公众号(小新数据库):MySQL alter table…,是否有更明智的方式?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/257199.html

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!