大表修改字段

一个好的问题描述有利于社区小伙伴更快帮你定位到问题,高效解决你的问题

【TiDB 使用环境】生产环境 /测试环境
【TiDB 版本】
【部署方式】云上部署(什么云)/机器部署
【操作系统/CPU 架构/芯片详情】
【机器部署详情】CPU大小/内存大小/磁盘大小
【集群数据量】
【集群节点数】
【问题复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
tidb数据库大表添加字段或者修改列类型,会重写所有行吗

问题描述的具体点

1 个赞

表中添加一列,值为null应该不会重写所有行

1 个赞

1. 添加字段(新增列)

  • 情况 1:添加 nullable 且有默认值的列(TiDB 3.0+) 不会重写所有行!TiDB 仅修改表的元数据,新列的默认值不会物理写入磁盘,而是在查询时动态计算返回。例如:ALTER TABLE big_table ADD COLUMN new_col VARCHAR(20) NULL DEFAULT 'default_val';

    • 优势:操作瞬间完成,不受表大小影响;
    • 注意:如果显式执行UPDATE给新列赋值,才会物理写入数据。
  • 情况 2:添加 NOT NULL 且有默认值的列(TiDB 5.0+)

    • TiDB 5.0 及以上:默认采用「懒加载」模式,仅修改元数据,首次读取 / 写入该行时才会将默认值写入磁盘,不会一次性重写所有行
    • TiDB 5.0 以下:会重写所有行,因为需要为每一行填充默认值,大表操作会非常慢且占用大量资源。
  • 情况 3:添加无默认值的 NOT NULL 列 直接报错(因为无法为已有行填充值),必须指定默认值,此时行为参考情况 2。

2. 修改列类型(重写所有行!)

无论 TiDB 版本,修改列类型一定会重写所有行,因为列的存储格式发生了变化,必须逐行转换数据

4 个赞

详细,学习了

感谢分享

添加字段(ADD COLUMN)

  • 不会重写所有行
  • TiDB 采用延迟回填优化:仅在元数据中记录新字段的默认值,不会立即更新所有历史行。
2 个赞

添加字段不会立即重写所有行,修改类型会重写的

学习了,感谢

tidb支持在线DDL,字段修改不影响业务上的DML

如果修改了类型,数据需要重写是怎么实现的呢

如果有默认值还是会重写的

– 1. 查看DDL任务状态,关注"REORG"阶段(有REORG则表示重写数据)
SELECT * FROM information_schema.tidb_ddl_jobs WHERE table_name = ‘big_table’ ORDER BY create_time DESC;

1 个赞

点赞,详细

学习下,收藏

是惰性重写还是立即重写呢

感谢老师分享

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。