Specified key was too long; max key length is 767 bytes(字段长度过长无法设置索引)

46 篇文章 0 订阅
18 篇文章 0 订阅

mysql innodb引擎 默认索引长度767 bytes

解决办法有一下几种:
1、减少索引字段长度(业务通常不允许);

2、采用前缀索引的方式以减少索引长度(方便,实用,但可能字段太长无效);

       text类型皆可

      设置前置索引sql:
      ALTER table zx_hw_gx_process add index title_pre(level_id_all(255))

      取消前置索引
      drop index title_pre on zx_hw_gx_process ;

3、改变字符集为gbk、latin1......(不推荐);
4、配置my.ini,将约束项扩展至3072byte,重启mysql(最好,但是麻烦);

     必须将text类型改为varchar类型

 步骤:

      windows环境下配置my.ini,linux环境下配置my.cnf:

      [mysqld]
            ##default-storage-engine = INNODB
            innodb_large_prefix = ON
            innodb_file_format = BARRACUDA

        建表 语句加上 ROW_FORMAT=DYNAMIC  ,

          CREATE TABLE `zx_hw_gx_process` (...) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC       COMMENT='工序表';

    如果表已存在则用一下语句参考:

设置参数:

set GLOBAL innodb_large_prefix=ON;

set global innodb_file_format = BARRACUDA;

如果ROW_FORMAT参数值不是DYNAMIC则在sql里运行这段

ALTER TABLE zx_hw_gx_process ROW_FORMAT = DYNAMIC;

查看参数:
show VARIABLES where variable_name='innodb_large_prefix'
show VARIABLES where variable_name='innodb_file_format'

show VARIABLES where variable_name='innodb_large_prefix' or variable_name='innodb_file_format'


 

关联知识:
1、常用不同字符集一个char所占byte数如下:
latin1 1 character = 1 byte
gbk 1 character = 2 byte
uft8 1 character = 3 byte
uft8mb4 1 character = 4 byte mysql5.5之后支持
utf8 和 utf8mb4的区别:
IOS内置的表情(emoji)在utf8时保存到数据库会成为乱码,因为emoji需要4个字节来存储,utf8mb4完全支持utf8,而且能使用4个字节来保存字符,解决了表情乱码的问题。

如果在一个utf8mb4字符集、长度为varchar(255)字段上建索引,则其所占长度为255*4字节,大于767,将导致报错。

设置索引注意事项:

索引虽然好处很多,但过多的使用索引可能带来相反的问题,索引也是有缺点的:

  • 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT,UPDATE和DELETE。因为更新表时,mysql不仅要保存数据,还要保存一下索引文件
  • 建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在要给大表上建了多种组合索引,索引文件会膨胀很宽

      索引只是提高效率的一个方式,如果mysql有大数据量的表,就要花时间研究建立最优的索引,或优化查询语句。

     使用索引时,有一些技巧:

    1.索引不会包含有NULL的列

       只要列中包含有NULL值,都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此符合索引就是无效的。

    2.使用短索引

       对串列进行索引,如果可以就应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

    3.索引列排序

       mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引。

    4.like语句操作

      一般情况下不鼓励使用like操作,如果非使用不可,注意正确的使用方式。like ‘%aaa%’不会使用索引,而like ‘aaa%’可以使用索引。

    5.不要在列上进行运算

    6.不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的

    7.索引要建立在经常进行select操作的字段上。

       这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。

    8.索引要建立在值比较唯一的字段上。

    9.对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少。

    10.在where和join中出现的列需要建立索引。

    11.where的查询条件里有不等号(where column != …),mysql将无法使用索引。

    12.如果where字句的查询条件里使用了函数(如:where DAY(column)=…),mysql将无法使用索引。

    13.在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值