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

ERROR 1071Specified key was too longmax key length is 767 bytes

DBA 杂谈笔记 2021-05-14
459

客户反馈创建索引报错,尝试复现

1.复现问题

    ************************** 1. row ***************************
    Table: cc
    Create Table: CREATE TABLE `cc` (
    `id` int(11) DEFAULT NULL,
    `name` varchar(255) DEFAULT NULL,
    KEY `name_index` (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    1 row in set (0.10 sec)
    mysql> create index namecc_index on cc(name);
    ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
    复制


    2 查找原因:

    索引  namecc_index 的长度 4*255>767 

    是由参数innodb_large_prefix 控制

    此参数控制索引前缀长度的,不开启最长的长度是 765byte,开启最长3072byte,一般出现此报错的数据库版本是小于MYSQL5.7,同时不同的版本开启的方式也略有不同

    3. 修改方式


    1. 在5.6的修改方式:

    设置变量所有实例都需要执行(否则从库重放报错)

    1.1

      set global innodb_file_format=Barracuda ;
      set global innodb_file_format_max=Barracuda ;
      set global innodb_large_prefix=1
      复制


      1.2 在主库修改 row_format 的格式

        alter table t1 row_format=dynamic;
        复制

        或者 在创建表指定

          create table uu (id int,name varchar(255)) row_format=dynamic;
          复制


          2. 在5.7 版本创建不会报错,因为

          innodb_large_prefix-=1 默认值 1 

          innodb_default_row_format=dynamic 默认是dynamic 

          innodb_file_format=Barracuda  默认值 Barracuda

          需要调整的参数的默认值符合要求


          3. 在8.0版本 此参数废弃,默认的行格式最长3072 byte



          总结:

                  一般在MySQL 5.7版本不会遇到此问题,只有在MySQL 5.6版本会遇到此问题,建议MySQL 5.6 升级到MySQL 5.7,比较MySQL 5.6 修改比较麻烦


          参考链接

          https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_large_prefix


          https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_large_prefix


          https://dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.html

          文章转载自DBA 杂谈笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论