MySQL -- Online DDL

什么是Online DDL Innodb存储引擎中,DML语句会在表上加MDL(Meta data Lock)读锁,DDL语句会在表上加MDL写锁,MDL锁是表锁。
【MySQL -- Online DDL】MDL读锁是共享的,MDL读锁与MDL写锁、MDL写锁与MDL写锁是互斥的;也就是说,在DDL语句执行过程中,持有MDL写锁,此时会阻塞新的select/update请求(因为要申请MDL读锁)。
当DDL语句执行需要很长时间时,后面的DML语句就会迟迟得不到执行。
为了解决这个问题,MySQL5.6增加了Online DDL的特性:当执行DDL语句时,先申请MDL写锁,然后MDL写锁退化为MDL读锁,此时便不再阻塞DML语句,这也是DDL被称为Online的原因。
Online DDL仅在开始时申请MDL写锁,然后再具体的数据操作之前,MDL写锁-->MDL读锁,由于数据操作是占用绝大部分时间的,故总体上看该DDL是Online的。
Online DDL的应用:重建表 我们知道,delete删除表中的某些记录行,仅仅将这些记录“标记”为已删除、可复用,并不会让.ibd文件变小。
为了解决这个问题,可以使用重建表的命令,让表空间更“紧凑”:

alter table t engine=innodb,ALGORITHM=inplace;

该语句的执行过程:
  • 建立临时文件tmp_file,扫描表t主键索引上的所有page;
  • 将表t上的记录生成新的B+Tree,存储到tmp_file中;
  • 在生成tmp_file过程中,若表t上有DML操作,将其记录到row-log中;
  • 在tmp_file生成后,将row-log apply到tmp_file,生成新的表数据;
  • 用tmp_file替换t的.ibd文件;
MySQL -- Online DDL
文章图片

Online DDL的应用:在线加索引 在业务运行过程中,发现某些查询很慢,需要在线给表加索引:
alter table t add index idx_aaa(`a`);

该DDL语句同样可以支持Online DDL,加索引的过程中,不影响表上DML语句的执行。
并不是添加所有的索引都是Online DDL,比如添加全文索引FULLTEXT index就不支持。
参考: 1.MySQL实战45讲

    推荐阅读