关于mysql:MySQL-Online-DDL

13次阅读

共计 899 个字符,预计需要花费 3 分钟才能阅读完成。

什么是 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 文件;

Online DDL 的利用:在线加索引

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

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

该 DDL 语句同样能够反对 Online DDL,加索引的过程中,不影响表上 DML 语句的执行。

并不是增加所有的索引都是 Online DDL,比方增加全文索引 FULLTEXT index 就不反对。

参考:

1.MySQL 实战 45 讲

正文完
 0