跳转至

千万级大表加字段慢如何处理

一、为什么慢

ALTER TABLE 需要: 1. 锁表。 2. 复制全表。 3. 加字段。 4. 切换表。

千万级要几十分钟到几小时,期间业务停摆。

二、MySQL 8.0 之前

pt-online-schema-change(pt-osc)

pt-online-schema-change --alter "ADD COLUMN c INT" D=db,t=table

流程: 1. 建新表,加字段。 2. 把旧表数据复制到新表。 3. 触发器同步增量。 4. rename 切换。

不锁表,但复制期间有性能影响。

gh-ost

GitHub 开源,无触发器,binlog 同步。

三、MySQL 8.0

Instant DDL

加字段(末尾)秒级完成:

ALTER TABLE t ADD COLUMN c INT, ALGORITHM=INSTANT;

不重写表,只改元数据。

In-Place DDL

大部分操作不锁表,在线执行。

四、不同场景

操作 MySQL 8.0 老版本
加列(末尾) Instant 秒级 pt-osc
加列(中间) 重写表 pt-osc
加索引 In-Place pt-osc
修改列类型 重写 pt-osc

五、业务侧方案

  • 灰度发布。
  • 低峰期操作。
  • 逻辑拆分:新字段先加在新表。

现在

MySQL 8.0 Instant DDL 加列基本秒级。老版本用 pt-osc。