工作中最常出现的问题是,如何在网上经常使用的大表中添加字段?
示例:下面的用户表字段。
有些同学说这还不简单,不能直接添加,使用以下命令。
添加完成后,再次检查表结构。
这个追加不成功吗?有什么!
是的,离线数据库怎么做都可以,但是在线数据库这样操作的话,整个服务都有停机的危险!自己也离毕业不远。
不是威胁性的话。我们去找凯斯测试一下。
为什么会发生这种事?
MDL锁定的作用是什么?
为了确保并行工作下数据的一致性。
如果一个事务正在运行,而另一个事务此时修改了表结构,则可能会出现无法重新读取当前事务的问题,并且事务也可能不会提交。
何时添加MDL锁?
MDL锁是MySQL自动隐式锁,不需要手动操作。
执行DDL语句时,MySQL会自动添加MDL读取锁定。
MySQL在执行DML语句时自动添加MDL写锁。
读锁和读锁不是互斥的,读锁和写锁写锁和写锁是互斥的。
注:MDL锁是锁定整个表的表锁。
什么是DML和DDL?
服务范围:对表数据执行操作,如insertdeleteselectupdate等。
修改表结构后,MySQL会自动添加表锁,并且是写锁,因此,它会阻止以后的所有读和写请求,从而导致严重的后果。
有没有优雅地在网上表中添加字段的方法?
当然,从MySQL 5.6版开始,添加了在线DDL,允许在执行DDL时同时执行DML。简单的翻译是,修改表结构时,可以同时执行额外的删除修改操作。
从MYSQL 8 . 0版开始,线上DDL已经过最佳化,并支援快速新增资料栏,可让您在大型表格初新增栏位。
例如:
这两个参数分别是干什么用的?有什么选择?
复制:
复制方法,MySQL5.6之前的DDL通过首先创建新表修改新表结构将旧表数据复制到新表删除旧表和重命名新表来运行。执行过程很耗时,生成大量磁盘IO,使用CPU,使缓冲池无效,旧表需要锁定,性能不好,目前很少使用。
原地修改,引入MySQL5.6的优点是,无需在服务器层复制表数据,即可同时执行DML操作。过程是先添加MDL写锁,执行初始化操作,然后降级到MDL读锁,执行DDL操作,升级到MDL写锁,最后完成DDL操作。
通过引入快速修改MySQL8.0,可以快速向大表中添加字段。
性能为“即时放置拷贝”。
LOCK指定在执行过程中是否锁定。选项包括:
NONE
允许在不解除锁定的情况下执行DML操作。
SHARED
添加读取锁定以允许读取操作,并禁止DML操作。
默认锁定模式。如果满足DDL操作,则默认锁定模式将允许尽可能多的读取和DML操作。
添加禁止读取和DML操作的写锁定。
联机DDL并不支持所有DDL操作。请查看支持哪些操作。
允许同时DML
仅修改元数据
添加列
yes
yes
yes
删除列
yes
yes
yes
重命名列
yes
yes
yes
更改列顺序
yes
yes
yes
设置列默认值
yes
yes
yes
yes
更改列数据类型
yes
yes
yes
yes
删除列默认值
yes
yes
yes
yes
更改自动增量值
yes
yes
将列设置为空
yes
yes
yes
列设置not null
yes
yes
yes
发表评论