mysql碎片率影响在线ddl吗_MySQL Online DDL影响

MySQL-online-DDL影响

DDL的作用是在执行Alter table的过程中,允许对表执行DML或者查询操作。

In-place表示该操作是否允许ALGORITHM=INPLACE子句,表示语句的执行只是在原表上执行

rebuild table表示该操作不支持ALGORITHM=INPLACE子句,要通过重新创建表来实现

Permit currentent dml表示该操作执行期间是否允许表的任意修改操作

Online DDL的作用是在执行Alter table的过程中,允许对表执行DML或者查询操作

在线创建/删除索引:

# 会话 1

mysql> alter table temp add index idx_k1(k1);

# 会话 2

mysql> update temp set k2='CCCC' where id=1001;

Query OK, 1 row affected (0.08 sec)

Rows matched: 1 Changed: 1 Warnings: 0

无影响

DDL操作对DML操作影响:

创建辅助索引:对DML语言无影响

删除辅助索引:对DML语言无影响

创建主键索引:对DML语言无影响

删除主键索引:对DML语言有影响

添加字段:对DML语言无影响

删除字段:对DML语言无影响

修改字段可控/不可为空:对DML语言无影响 null 变 not null

修改数据类型:对DML语言有影响 varchar(32) 变为 varchar(64)

255字节以内不拷贝数据(很快),255字节以外要创建临时表拷贝数据(很慢)

修改/增加/删除默认值:对DML语言无影响

Online DDL的实现过程

online ddl主要包括3个阶段,prepare阶段,ddl执行阶段,commit阶段,rebuild方式比no-rebuild方式实质多了一个ddl执行阶段,prepare阶段和commit阶段类似

Prepare阶段:

①:创建新的临时frm文件(与InnoDB无关)

②:持有EXCLUSIVE-MDL锁,禁止读写

③:根据alter类型,确定执行方式(copy,online-rebuild,online-norebuild) 假如是Add Index,则选择online-norebuild即INPLACE方式

④:更新数据字典的内存对象

⑤:分配row_log对象记录增量(仅rebuild类型需要)

⑥:生成新的临时ibd文件(仅rebuild类型需要)

ddl执行阶段:

①:降级EXCLUSIVE-MDL锁,允许读写

②:扫描old_table的聚集索引每一条记录rec

③:遍历新表的聚集索引和二级索引,逐一处理

④:根据rec构造对应的索引项

⑤:将构造索引项插入sort_buffer块排序

⑥:将sort_buffer块更新到新的索引上

⑦:记录ddl执行过程中产生的增量(仅rebuild类型需要)

⑧:重放row_log中的操作到新索引上(no-rebuild数据是在原表上更新的)

⑨:重放row_log间产生dml操作append到row_log最后一个Block

commit阶段:

①:当前Block为row_log最后一个时,禁止读写,升级到EXCLUSIVE-MDL锁

②:重做row_log中最后一部分增量

③:更新innodb的数据字典表

④:提交事务(刷事务的redo日志)

⑤:修改统计信息

⑥:rename临时idb文件,frm文件

⑦:变更完成

在线操作DDL类型对DML的影响:

63ce13470ab6c832fea9b36f36886bf1.png

d3d43cb2bec330182becf17ea067eb86.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值