mysql 为什么扩展VARCHAR列大小(从小于255到大于256)使用copy not inplace

3duebb1j  于 5个月前  发布在  Mysql
关注(0)|答案(1)|浏览(63)

在mysql 5.7 innodb-online-ddl-operations中,他说“In-place ALTER TABLE不支持将VARCHAR列的大小从小于256字节增加到等于或大于256字节。在这种情况下,所需的长度字节数从1变为2,这只有表副本才支持(ALGORITHM=COPY)“.但为什么不能像增加一列一样呢?增加一列也会改变行数据的存储结构,但它是通过inplace+rebuildtable实现的,并允许dml在执行阶段
我知道为什么使用copy,但我不明白为什么不使用inplace+rebuildTable

4si2a6ki

4si2a6ki1#

当前列中已存在数据。添加的列中将没有数据。
通过多个步骤:

  1. ALTER添加新列(INPLACE)
    1.从旧列更新新副本-- * 这将花费比副本更长的时间。*
  2. ALTER重命名列并DROP旧列--可能不是INPLACE。
    pt-online-schema-change可以在几乎没有停机的情况下完成所需的ALTER(这可能是您最好的选择)。
    你的问题是“为什么”:
  • 1字节与2字节的长度是一个小的优化,阻碍了。
  • 几乎所有不需要COPY就能完成的事情都在5.7中实现了。

复制是这样执行的:
1.使用新模式创建一个新表(更大的varchar)
1.把所有数据复制过来。-这是慢的部分。
1.重建索引。(也许这可以优化掉,但实现起来可能会很棘手。)这也可能很慢。
1.删除旧的副本。
ptosc是类似的(你可以自己做,但要正确处理所有的微妙之处是很棘手的):
1.使用新模式创建一个新表(更大的varchar)
1.添加一些TRIGGER来跟踪以下步骤中的更改。
1.将所有数据分块复制。索引可能是维护的,而不是构建-重建的。
1.锁定表的时间刚好足够复制最后一个块。这是唯一的阻塞时间,而且很短。
1.删除旧的副本。
总的时间会更长,但堵塞会短得多。

相关问题