暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何使用PolarDB MySQL秒级修改列字符集功能

芬芳 2024-03-25
298

在MySQL中,当用户指定列的字符集为UTF-8时,会默认使用utf8mb3字符集,该字符集最大使用3个字节来存储字符。如果用户需要存储表情(emoji)等信息时,则需要将列字符集修改为utf8mb4。一般情况下,修改列字符集需要重建表,耗时较长,且对业务影响较大。PolarDB MySQL版支持秒级修改列字符集,使用该功能您可以快速地修改字符集,且对业务无感。

前提条件

集群版本需为以下版本之一:

  • PolarDB MySQL版8.0.1版本且修订版本为8.0.1.1.40及以上,您可以通过查询版本号来确认集群版本。

    您需要先配置loose_innodb_support_instant_modify_charset参数才能在PolarDB MySQL版8.0.1版本的集群上使用该功能。

  • PolarDB MySQL版8.0.2版本,无修订版本限制。

    PolarDB MySQL版8.0.2版本的集群默认支持秒级修改列字符集功能,无需配置任何参数。

使用限制

  • 仅支持修改列类型为CHAR、VARCHAR、ENUM以及TEXT的列的字符集。
  • 仅支持将列字符集由utf8mb3修改为utf8mb4,或将任意字符集修改为BINARY类型。
  • 需要修改列字符集的列上没有创建任何索引。
  • 修改列字符集前后,列的长度必须满足以下要求:
    • 修改列字符集前后,列的最大存储长度均小于256个字节,或均大于255个字节。存储长度为字符集实际消耗的存储长度。

      例如,某列使用的字符集为utf8mb3,且列类型为VARCHAR(85),由于utf8mb3最大使用3个字节来存储字符,因此,该列的最大存储长度为853=255字节。若将该列的字符集修改为utf8mb4,其最大存储长度为854=340字节,由于修改列字符集后的最大存储长度大于256个字节,因此,修改该列字符集时不能秒级完成。

    • 目标字符集的列的最大存储长度不能小于原字符集的列的最大存储长度。

      例如,某列类型为CHAR(120),且使用的字符集为utf8mb3,列的最大存储长度为1203=360字节。修改为BINARY类型后,列的最大存储长度为1201=120字节。因此,该列不满足秒级修改列字符集的要求。

使用方法

  1. 配置参数。

    针对PolarDB MySQL版8.0.1版本,您需要将参数loose_innodb_support_instant_modify_charset的值设置为ON,才能使用秒级修改列字符集功能。设置参数值的具体操作请参见设置集群参数和节点参数。

    image.png

  2. 修改列字符集。

    • 指定ALGORITHM=INPLACE以强制使用秒级修改列字符集功能。示例如下:
      image.png

      使用上述语句时。若返回以下错误,表示当前修改列字符集操作不能以INPLACE算法执行,建议您查看参数loose_innodb_support_instant_modify_charset的值是否设置为ON,并仔细检查是否满足使用限制章节描述的情形。
      image.png

    • 不指定ALGORITHM或指定ALGORITHM=DEFAULT,PolarDB会自行选择执行速度最快的算法来执行修改操作。示例如下:
      image.png

使用效果

以包含一千万数据的表t1和t2为例,测试开启和关闭秒级修改列字符集时,将列的字符集由utf8mb3修改为utf8mb4的执行效果。其中,表t1和t2的表结构以及数据量完全相同。

  • 关闭秒级修改列字符集功能时,修改列的字符集需要重建表,执行时间大约需要1分钟左右,且整个DDL过程中只能执行查询操作。
    image.png
    执行结果如下:
    image.png
  • 开启秒级修改列字符集功能之后,修改列字符集可以无视表数据量大小,秒级完成修改列字符集操作。
    image.png
    执行结果如下:
    image.png
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论