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;

 


版权声明:本文为x235cl原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。