千万级大表加字段慢如何处理¶
一、为什么慢¶
ALTER TABLE 需要: 1. 锁表。 2. 复制全表。 3. 加字段。 4. 切换表。
千万级要几十分钟到几小时,期间业务停摆。
二、MySQL 8.0 之前¶
pt-online-schema-change(pt-osc)¶
流程: 1. 建新表,加字段。 2. 把旧表数据复制到新表。 3. 触发器同步增量。 4. rename 切换。
不锁表,但复制期间有性能影响。
gh-ost¶
GitHub 开源,无触发器,binlog 同步。
三、MySQL 8.0¶
Instant DDL¶
加字段(末尾)秒级完成:
不重写表,只改元数据。
In-Place DDL¶
大部分操作不锁表,在线执行。
四、不同场景¶
| 操作 | MySQL 8.0 | 老版本 |
|---|---|---|
| 加列(末尾) | Instant 秒级 | pt-osc |
| 加列(中间) | 重写表 | pt-osc |
| 加索引 | In-Place | pt-osc |
| 修改列类型 | 重写 | pt-osc |
五、业务侧方案¶
- 灰度发布。
- 低峰期操作。
- 逻辑拆分:新字段先加在新表。
现在
MySQL 8.0 Instant DDL 加列基本秒级。老版本用 pt-osc。