7

MySQL -- Online DDL

 2 years ago
source link: https://segmentfault.com/a/1190000040915618
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

什么是Online DDL

Innodb存储引擎中,DML语句会在表上加MDL(Meta data Lock)读锁,DDL语句会在表上加MDL写锁,MDL锁是表锁。

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文件;

image.png

Online DDL的应用:在线加索引

在业务运行过程中,发现某些查询很慢,需要在线给表加索引:

alter table t add index idx_aaa(`a`);

该DDL语句同样可以支持Online DDL,加索引的过程中,不影响表上DML语句的执行。

并不是添加所有的索引都是Online DDL,比如添加全文索引FULLTEXT index就不支持。

1.MySQL实战45讲


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK