您正在使用IPV4(3.92.28.52)访问本站 您本次共访问本站 1 次
 用户名: 密 码: 验证码:     用QQ登录本站
首页 软件 编程 笑话 知识 公告 台风 日历 计算器 行情 简化版
文明驾车我带头,文明行路我带头,礼貌让座我带头      

【腾讯云】爆款1核2G云服务器首年48元,还有iPad Pro、Bose耳机、京东卡等你来抽!       [公益] 节省一分零钱 献出一份爱心 温暖世间真情      
虚位以待
2021年 冬至节 19
2021年 圣诞节 23
2022年 元 旦 30
2022年 春 节 61
 
  • 本类新增
    本类热门文章
    您现在的位置:首页 >> 数据库 >> 内容
    mysql索引过长Specialed key was too long的解决方法
    内容摘要: 在创建要给表的时候遇到一个有意思的问题,提示Specifiedkeywastoolong;maxkeylengthis767bytes,从描述上来看,是Key太长,超过了指定的767字节限制下面是产生问题的表结构CREATETABLE`test_table`(`id`int(11)unsignedNOTNULLAUTO_INCREMENT,`name`var......
    在创建要给表的时候遇到一个有意思的问题,提示Specifiedkeywastoolong;maxkeylengthis767bytes,从描述上来看,是Key太长,超过了指定的767字节限制

    下面是产生问题的表结构

    CREATETABLE`test_table`(

    `id`int(11)unsignedNOTNULLAUTO_INCREMENT,

    `name`varchar(1000)NOTNULLDEFAULT'',

    `link`varchar(1000)NOTNULLDEFAULT'',

    PRIMARYKEY(`id`),

    KEY`name`(`name`)

    )ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4;

    我们可以看到,对于name,我们设置长度为1000可变字符,因为采用utf8mb4编码,所以它的大小就变成了1000*4>767

    所以再不修改其他配置的前提下,varchar的长度大小应该是767/4=191

    有兴趣的同学可以测试下,分别指定name大小为191,192时,是不是前面的可以创建表成功,后面的创建表失败,并提示错误Specifiedkeywastoolong;maxkeylengthis767bytes

    解决办法一

    使用innodb引擎

    启用innodb_large_prefix选项,修改约束扩展至3072字节

    重新创建数据库

    my.cnf配置

    setglobalinnodb_large_prefix=on;

    setglobalinnodb_file_per_table=on;

    setglobalinnodb_file_format=BARRACUDA;

    setglobalinnodb_file_format_max=BARRACUDA;

    上面这个3072字节的得出原因如下

    我们知道InnoDB一个page的默认大小是16k。由于是Btree组织,要求叶子节点上一个page至少要包含两条记录(否则就退化链表了)。

    所以一个记录最多不能超过8k。又由于InnoDB的聚簇索引结构,一个二级索引要包含主键索引,因此每个单个索引不能超过4k(极端情况,pk和某个二级索引都达到这个限制)。

    由于需要预留和辅助空间,扣掉后不能超过3500,取个“整数”就是(1024*3)。

    解决办法二

    在创建表的时候,加上row_format=DYNAMIC

    CREATETABLE`test_table`(

    `id`int(11)unsignedNOTNULLAUTO_INCREMENT,

    `name`varchar(255)NOTNULLDEFAULT'',

    `link`varchar(255)NOTNULLDEFAULT'',

    PRIMARYKEY(`id`),

    KEY`name`(`name`)

    )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4row_format=DYNAMIC;

    这个参数的作用如下

    MySQL索引只支持767个字节,utf8mb4每个字符占用4个字节,所以索引最大长度只能为191个字符,即varchar(191),若想要使用更大的字段,mysql需要设置成支持数据压缩,并且修改表属性row_format={DYNAMIC|COMPRESSED}

    上一篇:生成300个不同的随机数的SQL语句 下一篇:Oracle生成不重复票号与LPAD,RPAD与NE
    发布日期:2021/11/8
    手机扫二维码直达本页
    发布时间:16:28:02
    点击:237
    录入:壹家怡园
    相关文章
    • 没有相关文章
    Baidu
    YiJiaCMS 6.0.9.10888 Build 21.11.30(MSSQL) 闽ICP备05000814号-1
    本空间由腾讯云(轻量应用服务器)提供,百度云加速提供加速防护
    ©2000-2021