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,将导致报错。
设置索引注意事项:
索引虽然好处很多,但过多的使用索引可能带来相反的问题,索引也是有缺点的:
索引只是提高效率的一个方式,如果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只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用。