什么是 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 讲