- Copy:
拷贝方式,MySQL5.6 之前 DDL 的执行方式,过程就是先创建新表,修改新表结构,把旧表数据复制到新表,删除旧表,重命名新表 。执行过程非常耗时,产生大量的磁盘IO和占用CPU,还有使Buffer poll失效,而且需要锁住旧表,性能较差,现在基本很少使用 。
- Inplace:
原地修改,MySQL5.6开始引入的,优点是不会在Server层发生表数据拷贝,过程中允许并发执行DML操作 。过程就是先添加MDL写锁,执行初始化操作,然后降级为MDL读锁,执行DDL操作(比较耗时,允许并发执行DML操作),升级为MDL写锁,完成DDL操作 。
- Instant:
快速修改,MySQL8.0开始引入的,可以实现快速给大表添加字段 。
LOCK可以指定执行过程中,是否加锁,可选项有:
- NONE
不加锁,允许DML操作 。
- SHARED
加读锁,允许读操作,禁止DML操作 。
- DEFAULT
默认锁模式,在满足DDL操作前提下,默认锁模式会允许尽可能多的读操作和DML操作 。
- EXCLUSIVE
加写锁,禁止读操作和DML操作 。
操作InstantInplaceRebuilds Table允许并发DML仅修改元数据添加列YesYesNoYesNo删除列NoYesYesYesNo重命名列NoYesNoYesYes更改列顺序NoYesYesYesNo设置列默认值YesYesNoYesYes更改列数据类型NoNoYesNoNo设置VARCHAR列大小NoYesNoYesYes删除列默认值YesYesNoYesYes更改自动增量值NoYesNoYesNo设置列为nullNoYesYesYesNo设置列not nullNoYesYesYesNo像最常见的添加列就可以使用Instant,而像删除列、重命名列、更改列数据类型就只能使用Inplace了 。
文章插图
经验总结扩展阅读
- 腾讯云的弹性ip有什么用
- .NET 6 跨服务器联表查询
- 一个C#开发者学习SpringCloud搭建微服务的心路历程
- 基于Netty的TCP服务框架
- 什么是银团贷款
- 点在直线上的投影点怎么求
- 【.NET 6+Loki+Grafana】实现轻量级日志可视化服务功能
- 字体缓存服务可以禁止吗
- 一篇文章带你掌握主流服务层框架——SpringMVC
- 线上教育真的会取代线下教育吗