导读
MySQL的Online DDL长期饱受诟病,8.0之后有没有好一些呢...
本文重点讨论常见的几种Online DDL需求:
增加新列(ADD COLUMN)
修改列定义(MODIFY COLUMN)
增加/删除索引(ADD/DROP INDEX)
其他的DDL操作相对比较少,所以本文就不讨论了。
此外,本文也不讨论非InnoDB引擎以及非普通索引(如全文索引、空间索引)的场景。
我们先看下ALTER TABLE时ALGORITHM可以指定的几种方式:
COPY ,是指DDL时,会生成(临时)新表,将原表数据逐行拷贝到新表中,在此期间会阻塞DML
INPLACE,无需拷贝全表数据到新表,但可能还是需要IN-PLACE方式(原地,无需生成新的临时表)重建整表。这种情况下,在DDL的初始准备和最后结束两个阶段时通常需要加排他MDL锁(metadata lock,元数据锁),除此外,DDL期间不会阻塞DML
INSTANT,只需修改数据字典中的元数据,无需拷贝数据也无需重建整表,同样,也无需加排他MDL锁,原表数据也不受影响。