一个好的问题描述有利于社区小伙伴更快帮你定位到问题,高效解决你的问题
【TiDB 使用环境】生产环境 /测试环境
【TiDB 版本】
【部署方式】云上部署(什么云)/机器部署
【操作系统/CPU 架构/芯片详情】
【机器部署详情】CPU大小/内存大小/磁盘大小
【集群数据量】
【集群节点数】
【问题复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
tidb数据库大表添加字段或者修改列类型,会重写所有行吗
一个好的问题描述有利于社区小伙伴更快帮你定位到问题,高效解决你的问题
【TiDB 使用环境】生产环境 /测试环境
【TiDB 版本】
【部署方式】云上部署(什么云)/机器部署
【操作系统/CPU 架构/芯片详情】
【机器部署详情】CPU大小/内存大小/磁盘大小
【集群数据量】
【集群节点数】
【问题复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
tidb数据库大表添加字段或者修改列类型,会重写所有行吗
问题描述的具体点
表中添加一列,值为null应该不会重写所有行
情况 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+)
情况 3:添加无默认值的 NOT NULL 列 直接报错(因为无法为已有行填充值),必须指定默认值,此时行为参考情况 2。
无论 TiDB 版本,修改列类型一定会重写所有行,因为列的存储格式发生了变化,必须逐行转换数据
详细,学习了
感谢分享
添加字段不会立即重写所有行,修改类型会重写的
学习了,感谢
tidb支持在线DDL,字段修改不影响业务上的DML
如果修改了类型,数据需要重写是怎么实现的呢
如果有默认值还是会重写的
– 1. 查看DDL任务状态,关注"REORG"阶段(有REORG则表示重写数据)
SELECT * FROM information_schema.tidb_ddl_jobs WHERE table_name = ‘big_table’ ORDER BY create_time DESC;
点赞,详细
学习下,收藏
是惰性重写还是立即重写呢
感谢老师分享
此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。