MySQL “Specified key was too long; max key length is 767 bytes”解决办法

对于参与索引的字段,增加字段长度时可能会出现错误“Specified key was too long; max key length is 767 bytes”。

因为数据库建立索引时允许的最大长度是767字节。如果开启innodb_large_prefix,则长度扩展至3072字节。

对于UTF-8而言,一个字符占3个字节,varchar(300)长度就是300*3=900字节>767字

 

方案一

启用innodb_large_prefix,将约束项扩展至3072byte。

my.cnf配置:

default-storage-engine=INNODB

innodb_large_prefix=on

方案二

为索引字段指定长度。先删除原索引再重新创建 ,指定字段长度。

对于较长的字段,没必要整个都参与索引计算。只要指定字段的前几个字符,能较为有效地区分不同记录即可。这样既能达到索引效果,又能减小索引文件。

ALTER TABLE `order`
    DROP KEY `idx_aaa`, -- 删除原索引
    DROP KEY `idx_bbb`,
    DROP KEY `idx_mix`,
    
    MODIFY `aaa` varchar(500) DEFAULT NULL COMMENT 'aaa',   -- 修改字段长度
    MODIFY `bbb` varchar(500) DEFAULT NULL COMMENT 'bbb',
    
    ADD KEY `idx_aaa`(`aaa`(11)) USING BTREE, -- 重新添加索引,指定字段参与索引的长度
    ADD KEY `idx_bbb`(`bbb`(4)) USING BTREE,
    ADD KEY `idx_mix`(`ccc`(8),`ddd`(6)) USING BTREE;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值