Mysql之索引长度限制方式

 更新时间:2024年01月29日 08:32:35   作者:magic_kid_2010  
这篇文章主要介绍了Mysql之索引长度限制方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Mysql索引长度限制

在设置 utf8mb4 字段的字符长度时,可能会抛出一个异常:

"Specified key was too long; max key length is 1000 bytes"

也就是在给表的索引字段添加字符长度时,超过了最大索引长度 1000 字节。

一、原因分析

关于索引长度的限制,最主要的因素就是存储引擎和字符集。

字符集的影响在于,不同的字符集,单个字符包含的最大字节数有所不同。

比如 utf8 字符集,一个字符最多包含 3 个字节。而 utf8mb4 一个字符最多包含 4 个字节。

对于 InnoDB 引擎来说:

1) Mysql 版本 <=5.7.6

  • 如果是单字段索引,则字段长度不应超过 767 字节。
  • 如果是联合索引,则每个字段长度都不应超过 767 字节,且所有字段长度合计不应超过 3072 字节。

这种情况下,常见字符集和引擎组合后的字符长度限制如下:

InnoDB最大字节数单字段索引最大字符数联合索引合计最大字符数
lantin117673072
gbk23831536
utf832551024
utf8mb44191768

2) Mysql 版本 >=5.7.7

在该版本情况下,由于 InnoDB 引擎的 innodb_large_prefix 等选项默认值改变,单字段索引长度限制增大。

  • 如果是单字段索引,则字段长度不应超过 3072 字节。
  • 如果是联合索引,则每个字段长度都不应超过 3072 字节,且所有字段长度合计不应超过 3072 字节。

这种情况下,常见字符集和引擎组合后的字符长度限制如下:

InnoDB最大字节数单字段索引最大字符数联合索引合计最大字符数
lantin1130723072
gbk215361536
utf8310241024
utf8mb44768768

对于 MyISAN 引擎来说:

如果 Mysql 版本 <=5.5.4 则其默认存储引擎为 MyISAN。

  • 如果是单字段索引,则字段长度不应超过 1000 字节。
  • 如果是联合索引,则每个字段长度都不应超过 1000 字节,且所有字段长度合计不应超过 1000 字节。

这种情况下,常见字符集和引擎组合后的字符长度限制如下:

MyISAM最大字节数单字段索引最大字符数多字段索引合计最大字符数
lantin1110001000
gbk2500500
utf83333333
utf8mb44250250

二、解决方法

(1)修改存储引擎

(2)修改字符集

(3)修改索引字段的字符长度

在 Mysql 版本 <=5.7.6 且字符集为 utf8mb4 的情况下,设置需要添加索引的字段长度为 191。

(4)在 Mysql<=5.7.6 的情况,修改 InnoDB 选项,将单字段索引长度限制由 767 字节(bytes)提高到 3072 字节。

先查看当前默认选项值:

SHOW VARIABLES LIKE 'innodb_large_prefix';
SHOW VARIABLES LIKE 'innodb_file_per_table';
SHOW VARIABLES LIKE 'innodb_file_format';

确认选项值是否是:

innodb_large_prefix=ON
innodb_file_per_table=ON
innodb_file_format=Barracuda

如果不是,进行相应的修改:

SET GLOBAL innodb_large_prefix = 1;
SET GLOBAL innodb_file_per_table = 1;
SET GLOBAL innodb_file_format = barracuda;

上面两项的值设置为 1 而不是 ON,是因为在 Mysql5.6 之前,布尔值的变量还无法识别 ON 或者 OFF,只能是数字 1 或者 0。

并且,在创建新表时还要指定 ROW_FORMAT=DYNAMIC 或 ROW_FORMAT=COMPRESSED。

如:

CREATE TABLE `test` (
`a` varchar(767),
`b` varchar(1),
`c` varchar(200),
`d` varchar(168),
`e` varchar(5),
KEY `a_index` (`a`,`b`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;

或修改当前表:

ALTER TABLE [...], ROW_FORMAT=DYNAMIC;

(5)在创建索引时限制字段上的前缀索引长度:

CREATE TABLE `test` (
`a` varchar(767),
`b` varchar(1),
`c` varchar(200),
`d` varchar(168),
`e` varchar(5),
KEY `a_index` (`a`(191),`b`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql 自增长约束(auto_increment)的使用

    mysql 自增长约束(auto_increment)的使用

    MySQL中的自增长约束(auto_increment)用于自动为表的主键字段生成唯一的递增值,通过设置该属性,可以简化主键的管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • MySQL 5.7.17 免安装版本的安装配置

    MySQL 5.7.17 免安装版本的安装配置

    这篇文章主要为大家详细介绍了MySQL 5.7.17 免安装版本的安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 为什么mysql字段要使用NOT NULL

    为什么mysql字段要使用NOT NULL

    数据库字段一定要设置为 not null,不然会有很大的bug,下面就一起来介绍一下,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 初步介绍MySQL中的集合操作

    初步介绍MySQL中的集合操作

    这篇文章主要介绍了初步的MySQL中的集合操作,即UNION DISTINCT和UNION ALL两个命令,需要的朋友可以参考下
    2015-04-04
  • MySQL中根据出生日期计算年龄两种方法

    MySQL中根据出生日期计算年龄两种方法

    使用SQL语句计算年龄,在事务处理和日期计算中,较为常见,下面这篇文章主要给大家介绍了关于MySQL中根据出生日期计算年龄的两种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • 详解MySql中InnoDB存储引擎中的各种锁

    详解MySql中InnoDB存储引擎中的各种锁

    本文主要介绍了详解MySql中InnoDB存储引擎中的各种锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • mysql通过查看跟踪日志跟踪执行的sql语句

    mysql通过查看跟踪日志跟踪执行的sql语句

    在SQL SERVER下跟踪sql采用事件探查器,而在mysql下如何跟踪sql呢,下面有个不错的方法,大家可以参考下
    2014-01-01
  • MYSQL输入密码后闪退现象的解决方法

    MYSQL输入密码后闪退现象的解决方法

    最近在启动MySQL服务端并输入密后,出现闪退现象,实际上这种问题很常见,下面这篇文章主要给大家介绍了关于MYSQL输入密码后闪退现象的解决方法,文中介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • MySQL无法存储emoji表情解决方案分析

    MySQL无法存储emoji表情解决方案分析

    这篇文章主要介绍了MySQL无法存储emoji表情解决方案,结合实例形式分析了Python爬虫爬取文章中emoji表情存入数据库的实现方法,涉及mysql utf8mb4编码的修改相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • 使用Canal和Kafka解决MySQL与缓存的数据一致性问题

    使用Canal和Kafka解决MySQL与缓存的数据一致性问题

    这篇文章主要介绍了使用Canal和Kafka解决MySQL与缓存的数据一致性问题,文中通过图文结合的方式给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-07-07

最新评论