文档首页/ 数据复制服务 DRS/ 常见问题/ 实时迁移/ Oracle到MySQL迁移时,索引超长如何处理
更新时间:2022-08-05 GMT+08:00

Oracle到MySQL迁移时,索引超长如何处理

索引长度说明

MySQL引擎对索引长度有一些限制,最主要的因素就是存储引擎和字符集。不同的字符集,单个字符包含的最大字节数有所不同。例如UTF8字符集,一个字符最多包含3个字节。而UTF8MB4一个字符最多包含 4 个字节。
  • 如果是单字段索引,则字段长度不应超过表1中的“单字段最大字符数”。例如,MySQL 5.7.6版本的InnoDB引擎,单字段索引不应超过767个字节(字符数=767/最大字节数)。
  • 如果是联合索引,则每个字段长度均不能超过表1中的“单字段索引最大字符数”,且所有字段长度合计不应超过“联合索引合计最大字符数”。例如,MySQL 5.7.6版本的InnoDB引擎,每个字段索引不应超过767个字节(字符数=767/最大字节数),且所有字段索引长度总和不超过3072个字节(字符数=3072/最大字节数)。
表1 索引长度说明

引擎

MySQL版本

字符集

最大字节数

单字段索引最大字符数

联合索引合计最大字符数

InnoDB

MySQL 5.7.6及以下版本

UTF8MB4

4

191

768

MySQL 5.7.7及以上版本

UTF8MB4

4

768

768

索引超长的处理方法

  • 方法一

    不迁移含有超长索引的表。

  • 方法二

    修改源库索引长度满足以上索引长度说明中的要求,改操作可能导致迁移后数据不完整,请谨慎使用。以目标库为MySQL 5.7.6及以下版本的UTF8MB4为例,可通过如下方式修改长度。

    alter table tablename modify columnname varchar2 (768) ;

其中,tablename请用实际表名代替,columnname请用实际列名代替。

  • 方法三

    在源库删除该索引及其约束。以目标库为MySQL 5.7.6及以下版本的UTF8MB4为例,可通过如下方式删除索引及其约束。

    drop index indexname;
    alter table tablename drop constraint constraintname;

    其中,indexname请用实际索引名代替,tablename请用实际表名代替,constraintname请用实际约束名代替。