关于在线DDL的一个问题

【 TiDB 使用环境】测试/ Poc
【 TiDB 版本】7.5.1
将一个表结构的字段从varchar(100)改为varchar(200),速度很快,毫秒级别。但是如果从varchar(200)改为varchar(100),速度非常慢,admin show ddl jobs查看,发现该操作状态为"write reorganization",请问是何原因

1 个赞

varchar(100)改为varchar(200),应该只需要改元数据
varchar(200)改为varchar(100),需要回填数据,都得再写一遍

7 个赞

一般类型的大小都是小变大,很少大变小,为什么需要改小的啊

所有缩小,都是把原来的清除,再写入

考虑到数据问题

为啥会变小,这是什么操作,变小的话为了保证数据是对的,应该需要重新写一遍吧

感觉是内部采用了简单的处理逻辑导致的。
字段扩位只需要修改一些元数据,但是缩短就涉及到缩短后是否合法的问题了。
我猜tidb内部逻辑没有记录表字段目前数据的最大长度,如果记录了当前所有行的最大长度,应该也可以做到修改元素据就完事吧?

一个不处理数据一个要处理数据的区别

变小会自动截取吗

如果遇到超过100的呢,更改是退出还是继续

会报错退出

我觉得一个是逻辑ddl,第二个是物理ddl,物理ddl会进行reorg操作,所以会比较慢
DDL 语句的执行原理及最佳实践 | PingCAP 文档中心

1 个赞

DDL 语句的执行原理及最佳实践 | PingCAP 文档中心

1 个赞

嗯嗯,明白了