mysql 索引过长1071-max key length is 767 byte

问题

create table: Specified key was too long; max key length is 767 bytes

原因

数据库表采用utf8编码,其中varchar(255)的column进行了唯一键索引

而mysql默认情况下单个列的索引不能超过767位(不同版本可能存在差异)

于是utf8字符编码下,255*3 byte 超过限制

解决

1 使用innodb引擎;

2 启用innodb_large_prefix选项,将约束项扩展至3072byte;

3 重新创建数据库;

my.cnf配置:

default-storage-engine=INNODB

innodb_large_prefix=on

一般情况下不建议使用这么长的索引,对性能有一定影响;

这是网上的一遍文章的解决办法,但是我没有修改成功

下面我参考了一些其他的文章并结合自己的操作一步步去确定问题在哪。

有同学问到InnoDB的索引长度问题,简单说几个tips。

关于3072

大家经常碰到InnoDB单列索引长度不能超过767bytes,实际上联合索引还有一个限制是3072。

Sql代码 收藏代码

mysql> CREATE TABLE tb (

-> a varchar(255) DEFAULT NULL,

-> b varchar(255) DEFAULT NULL,

-> c varchar(255) DEFAULT NULL,

-> d varchar(255) DEFAULT NULL,

-> e varchar(255) DEFAULT NULL,

-> KEY a (a,b,c,d,e)

-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes

可以看到,由于每个字段占用255*3, 因此这个索引的大小是3825>3072,报错。

为什么3072

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

所以一个记录最多不能超过8k。

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

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

单列索引限制

上面有提到单列索引限制767,起因是256×3-1。这个3是字符最大占用空间(utf8)。但是在5.5以后,开始支持4个字节的uutf8。255×4>767, 于是增加了一个参数叫做 innodb_large_prefix。

这个参数默认值是OFF。当改为ON时,允许列索引最大达到3072。

** 我又参考了上边这篇文章确定了这个最大3072是可以的,那下面我们找方法把它弄成3072.**

又参考了一篇文章,终于有点眉目了

创建一张表,其中有个varchar 大字段,并且在这个字段上建索引,结果发现MySQL报错:

ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.

以下为建表语句:

create table piratebay(

SYS_ID int ,

FILE_NAME VARCHAR(200),

FILE_ID VARCHAR(30),

NUM1 VARCHAR(30),

NUM2 VARCHAR(30),

MAGNET_LINK VARCHAR(500),

PRIMARY KEY (sys_id),

KEY piratebay_n1 (FILE_NAME))

engine=innodb;

MySQL 环境配置:

Server version: 5.6.28-log MySQL Community Server (GPL)

Server characterset: utf8mb4

Db characterset: utf8mb4

解决办法:

(1)查看相关配置并作出如下设置

innodb_large_prefix = ON

innodb_file_format = Barracuda

innodb_file_per_table = ON

(2)修改建表语句,加入 row_format=DYNAMIC

create table piratebay(

SYS_ID int ,

FILE_NAME VARCHAR(200),

FILE_ID VARCHAR(30),

NUM1 VARCHAR(30),

NUM2 VARCHAR(30),

MAGNET_LINK VARCHAR(500),

PRIMARY KEY (sys_id),

KEY piratebay_n1 (FILE_NAME))

engine=innodb row_format=dynamic;

原因:

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

大家看明白了吧,吧row_formatl类型修改为这两种模式。

下面是我做的过程图:

可以看到row_formatl类型,下面修改类型

CREATE TABLE test2 ( id int(11) NOT NULL AUTO_INCREMENT, date varchar(25) DEFAULT NULL, sess_id varchar(255) DEFAULT NULL, keyword varchar(25) NOT NULL, url_n varchar(3) DEFAULT NULL, s_n varchar(3) DEFAULT NULL, select_url varchar(255) DEFAULT NULL, UNIQUE KEY (id,keyword) ) ENGINE=innodb DEFAULT row_format=dynamic;

ok,了这就可以插入超过767字节的索引了,怎么样,没看明白?那就对了,只有自己做过才能看懂这图片中代表的都是什么意思。加油吧。

修改Mysql索引长度限制

标签:情况   数据库表   int   最大   默认值   log   ble   shadow   链表

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:http://blog.51cto.com/13120271/2315189

mysql 索引太长_修改Mysql索引长度限制相关推荐

  1. mysql键太长_数据库,主键为何不宜太长长长长长长长长?(转)

    本文来自微信公众号 继续回答星球水友提问: 沈老师,我听网上说,MySQL数据表,在数据量比较大的情况下,主键不宜过长,是不是这样呢?这又是为什么呢? 这个问题嘛,不能一概而论: (1)如果是Inno ...

  2. 简述修改 MySQL 配置文件的方法_修改mysql配置文件的方法举例

    1启动选项中修改 启动mysql的时候加参数  -O max_heap_table_size=64M . 2.修改my.cnf 在[mysqld]的段中 增加 max_heap_table_size ...

  3. mysql删除默认密码_修改mysql默认密码方法

    问题描述 今天在MAC上安装完MYSQL后,MYSQL默认给分配了一个默认密码,但当自己在终端上使用默认密码登录的时候,总会提示一个授权失败的错误:Access denied for user 'ro ...

  4. mysql 统计时长_使用 mysql 统计平均用户在线时长

    在表中,记录了用户 login/logout 的时间点(unix时间).现在需要确定当日用户的在线时长总和,与平均在线时长. 简单的说,就是要求出匹配 userid 的 login/logout ti ...

  5. mysql表 列 备注_修改mysql 数据库的 表的列的备注信息

    1 INFORMATION_SCHEMA提供了访问数据库元数据的方式. 元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等.有些时候用于表述该信息的其他术语包括"数据词典& ...

  6. mysql数据库目标库_修改mysql数据库的库名

    假如源数据库名称为"srcdb",目标数据库名称为trgdb 首先创建目标数据库: create database trgdb; 查看源数据库中的所有表名: use informa ...

  7. Latex插图索引太长了如何解决?

    Latex插图索引太长了如何解决? http://t.zoukankan.com/cslxiao-p-6227463.html 在caption后边加上[],里边输入短的title即可.

  8. 在Linux环境下mysql的root密码忘记解决方法 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。 2.修改MySQL的登录设置: # vi /etc/my.c

    在Linux环境下mysql的root密码忘记解决方法 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 2.修改MySQL的登录设置: # vi /etc/my.cnf ...

  9. yum mysql的安装目录在哪_linux下yum安装 mysql 及详细配置及修改mysql默认目录

    linux下yum安装 mysql 及详细配置及修改mysql默认目录. 一.[root@sample ~]# yum -y install mysql-server ← 安装MySQL -..略 I ...

最新文章

  1. Xcode 代码块添加
  2. iPhoneX适配随笔
  3. Singing Everywhere
  4. UBUNTU804VirtualBox出现常见问题解决(转高手的)我转的CU的
  5. Date类的构造方法以及成员方法220
  6. php使用七牛直播,七牛上传文件,PHP版本
  7. .NET Core/标准自动增量版本控制
  8. HTTPS SSL/TLS协议原理
  9. Eclipse中使用google代码风格
  10. 大数据开发基础入门与项目实战(一)Java SE之4.方法和封装
  11. Qt 实现 别踩白块儿。
  12. 嘴里又苦又干,还有异味
  13. STATUS of v$archive_dest的一些情况
  14. unity发射弓箭轨迹的实现
  15. html字体图标设置
  16. 判断是手机还是平板html,“吃鸡”用平板好还是手机好?大神给出了答案,不同理解不同格局...
  17. 记一次重大的生产事故
  18. AVD Nexus_5X_API_P is already running. If that is not the case, delete the files at ...
  19. 计算机图形学在卫星的应用,计算机图形学课程设计教程-反走样卫星
  20. 字符串操作——substr用法

热门文章

  1. Solidworks不能生成此特征因为这将导致厚度为零的几何体
  2. IC基础知识(八)ROM、PROM、EPROM、EEPROM和Flash之间的区别
  3. [附源码]java毕业设计同德佳苑物业管理系统论文
  4. html icon 引入emoji,给自己网站增加Emoji表情图标(可以在百度显示类
  5. 超详细的AD8031ARZ介绍,就在这里
  6. Oracle的VPD介绍
  7. flash幻灯片动画模板
  8. 如何将Android数据库操作通用化(四)
  9. sony 播放器 android,试玩 | “重新拥抱Android系统”Sony NW-ZX505 便携播放器
  10. 中国 A 股纳入 MSCI