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

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

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

CREATE TABLE `t_0322` (
  `id` bigint NOT NULL,
  `a` varchar(188) DEFAULT NULL,
  `b` varchar(64) DEFAULT 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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值