- MySQL DDL即时INSTANT
DDL即时Instant 功能自MySQL 8.0.12版本引入。在准备和执行期间,不会在表上采用独占元数据锁,并且表数据不受影响,从而使操作立即生效。允许并发DML。
那先看看官网描述作用:
- 添加一个列。这个特性称为“即时添加列”。
- 添加或删除虚拟列。
- 添加或删除列默认值。
- 修改ENUM或SET列的定义。同样的限制也适用于上述的ALGORITHM=INSTANT。
- 更改索引类型。
- 重命名表。同样的限制也适用于上述的ALGORITHM=INSTANT。
DDL里 ALTER命令附带常用的参数:
ALTER TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
ALGORITHM [=] {DEFAULT|INSTANT|INPLACE|COPY}
ALGORITHM子句主要用于性能比较,并在遇到任何问题时作为对旧的表复制行为的备份
LOCK = DEFAULT, NONE(允许读和写), SHARED(允许读), EXCLUSIVE(独占锁)
- MySQL8.0.19版本测试:
##测试表
CREATE TABLE `t_temp` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` tinyint(4) NOT NULL,
`create_time` datetime NOT NULL,
`update_time` datetime NOT NULL,
`addr` varchar(10) DEFAULT NULL,
`sex` enum('M','F') DEFAULT NULL,
PRIMARY KEY (`id`),
key (name)
) ;
##添加一个字段,加到最后面
ALTER TABLE t_temp ADD addr varchar(10),ALGORITHM=INSTANT;
ALTER TABLE t_temp ADD COLUMN sex ENUM('M', 'F'), ALGORITHM = INSTANT;
##初始化值
ALTER TABLE t_temp ALTER COLUMN age SET DEFAULT 10, ALGORITHM = INSTANT;```
##重命名表明
ALTER TABLE t_temp1 RENAME TO t_temp2, ALGORITHM = INSTANT;
##变化长度【不可以】
ALTER TABLE t_temp MODIFY COLUMN addr varchar(10), ALGORITHM=INSTANT;
##drop column 【不支持】
ALTER TABLE t_temp DROP COLUMN addr, ALGORITHM = INSTANT;
重命名,添加,更改初始化值,长度变更 不行,删除 不行
##索引操作
## 主键可以操作
ALTER TABLE t_temp DROP PRIMARY KEY, ADD PRIMARY KEY(id),ALGORITHM = INSTANT;
##无索引的列,添加索引【失败】
mysql> ALTER TABLE t_temp ADD index addr(addr),ALGORITHM = INSTANT;
ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE.
##对存在的索引更改
mysql> ALTER TABLE t_temp DROP INDEX idx_nm, ADD INDEX idx_nm(name),ALGORITHM = INSTANT;
##索引长度变更【失败】
mysql> ALTER TABLE t_temp DROP INDEX idx_nm, ADD INDEX idx_nm(name(2)),ALGORITHM = INSTANT;
##唯一索引【失败】
ALTER TABLE t_temp ADD UNIQUE INDEX index_nm3(name);
ALTER TABLE t_temp DROP INDEX index_nm3, ADD INDEX index_nm3(name),ALGORITHM = INSTANT;
##全文索引可以
ALTER TABLE t_temp ADD FULLTEXT index_nm4(name);
ALTER TABLE t_temp DROP INDEX index_nm4, ADD FULLTEXT index_nm4(name),ALGORITHM = INSTANT;
##外键不行,外键关联的时候,【是不允许删除的】
ALTER TABLE t_temp DROP INDEX index_nm5, ADD INDEX index_nm5(name),ALGORITHM = INSTANT;
##innodb行格式不能是COMPRESSED,8.0.19版本测试是支持(应该是行溢出可能存在问题)
ALTER TABLE t_temp ROW_FORMAT = DYNAMIC
同类型的索引 重建可以,无索引的字段添加不可以,唯一索引不可以,所以长度变更不可以,跟innodb 压缩没关系。
- 限制:
- 只能顺序加列, 仅支持在最后添加列,而不支持在现有列的中间添加列
- 不支持临时表,临时表只能使用copy的方式执行DDL
- 不支持那些在数据词典表空间中创建的表
- 数据字典中的表不能使用instant算法
总结:之前从其他技术分享中了解到一些信息,但自己亲测之后,不同点很多。可能版本的问题,所以很多事情还得自己动手。
最后修改时间:2022-12-27 13:53:29
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




