mysql的Innodb最大支持的索引长度是多少,以及索引长度怎么计算

今天正好有空,来讲个之前粉丝经常问的一个知识,就是mysql的Innodb最大支持的索引长度是多少?以及索引长度怎么计算?

一、mysql的innodb引擎,创建索引最大支持的长度是多少字节?

不墨迹,直接说答案:

在mysql8之前,索引最大长度为 767字节

在mysql8之后,索引最大长度为 3072字节

然后再建个简单的表,来验证一下

我使用的mysql 8的版本

建一张简单的student表,表结构如下图

 

然后,我创建一个长度大于3072字节的索引

比如我给 address 这个字段上添加索引,它会提示以下错误信息

提示 key was too long; max key length is 3072 bytes

意思是 你创建的索引超出长度,并且告诉你,最大支持的长度是 3072 bytes。

那我刚才想要创建的 address 这个索引,它具体的长度是多少呢?

只有知道它的长度是多少,才能确定它是不是真的超过 3072字节

想要知道 varchar(1500)  长度是多少个字节,需要知道下面这个经常被问到的问题:

varchar(255),里的这个255是255个字节?还是255个字符???

二、varchar(255),里的这个255是255个字节?还是255个字符?

这个255是代表255个字节?还是255个字符?

不墨迹,直接说答案:

mysql5.0之前是255个字节

mysql5.0之后是255个字符

所以上边那个问题就可以知道答案了:

因为,我使用的mysql版本是8,是属于5.0之后的版本,所以 varchar(1500) 就表示1500个字符

又因为创建这个字段的时候,使用的是 utf8mb4 表示一个字符4个字节

所以 1500 x 4 = 6000 字节,6000字节 > 3072字节,所以上边创建这个 address 索引时,就报长度过长的错误。 

下面再改一下 address 这个字段的长度,把它的长度改到小于3072,然后再来创建这个索引,试一下,看是否可以成功

好,把address 改成 varchar(768)  了

再试下,创建索引

看到没,创建成功了,因为 768 x 4 = 3072

可以再给它加1,改成769,再试一下,又报错了。

 

还有个小知识点需要知道,就是 mysql建表的时候,经常使用的字符串类型是varchar

创建varchar 这种数据类型时,常用的字符集有 utf8mb4 和 utf8

看到没,就上图这俩,utf8mb4 和 utf8

utf8mb4刚才说了,它的每个字符是占4个字节

那utf8呢?它的每个字符占几个字节?

其实 utf8 就是 utf8mb3,从名字也能知道,它的每个字符是占3个字节

uft8,在 V8.0 还是指代的utf8mb3,据说未来的会变为uft8mb4,不过只是据说,还暂未确定

三、你创建的索引,这个索引的长度怎么计算?

既然都说到这了,那下面继续把mysql中 索引长度的计算一起说一下吧

mysql中普通索引的长度,非常好计算,普通索引的长度就是创建这个字段时,这个字段类型的长度,下面列出了常见的数据类型的长度

  • 数值类型

    • tinyint:1字节

    • small int:2字节

    • medium int:3字节

    • int:4字节

    • bigint:8字节

  • 时间类型

    • date:3字节

    • timestamp:4字节

    • datetime:8字节

除了上边常用的几种类型外,char和varchar也很常用

  • char(n):括号里的n是几,就代表几个字节

  • varchar(n):如果你用的是utf8也就是utf8mb3,那长度是3n+2;如果你用的是utf8mb4,那长度是4n+2;加2是因为 需要2字节存储字符串长度。

  • 还有就是,如果建表的时候 字段允许是null,需要1个字节记录是否可以为null,如果允许为null,则需要 加 1 个字节存储;如果不允许null,则不需要加1个字节

知道了这些之后,就可以计算索引的长度了。

普通单列索引的长度就是,你添加索引的这个字段列的数据类型的字节长度

联合索引的长度就是,你联合的这几个字段列的数据类型的字节长度相加。

下面,可以使用mysql中的 explain 执行计划,来验证一下

1、普通单列索引长度的验证

首先,先给 age这个字段加个普通单列索引

并且,如下图,我在建表的时候,这个age用的是int类型的,int类型的长度大小是4字节

并且 允许为null,所以验证期望的结果长度应该是  4 + 1 = 5 字节

查询验证一下

上图可以看到,查询的走了 idx_age这个索引,而且explain中显示 的key_len为5

我把那个允许null,改成不允许null,再试一下

看到没,改成不允许null后,key_len变成4了

2、多列联合索引长度的验证

首先,先给这个表添加一个联合索引,idx_name_age 联合的是name和age这2列

然后再确认一下 name和age这两列的数据类型

上图,可以看到,name是varchar类型的,为了计算方便,我把它的varchar长度给的是100

age使用的是int类型并且这两列都不允许null

具体的计算过程:

name用的是varchar(100)   utf8mb4,而且不允许null,所以 name的索引长度 (4x100) +2 = 402

age 用的是int,int的长度是4字节,所以 age的索引长度是4

所以,咱们的预期是,最后idx_name_age 这个联合索引的长度是两者相加,402 + 4 = 406

好,下面 使用 explain 查询验证一下

可以看到结果跟咱们预期的一样:走了 idx_name_age 这个联合索引,并且idx_name_age联合索引的长度是406,和咱们预期的结果一样。

ok,今天就写这么多吧

纯手敲 原创不易,如果觉得对你有帮助,可以关注一下,打赏一下,感谢

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31135.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络安全工程】任务11:路由器配置与静态路由配置

目录 一、概念 二、路由器配置 三、配置静态路由CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog 一、概念 1、路由器的作用:通过路由表进行数据的转发。 2、交换机的作用:通过学习和识别 MAC 地址,依据 M…

Dagger 2 系列(五)——进阶之@Scope 和 @Singleton

前言: 在上一篇Dagger 2 系列(四)——Named 和 Qualifier注解介绍,了Named 和 Qualifier注解,这篇文章,我们将会了解另外俩个注解:Scope 和 Singleton。 在这篇文章中你会了解到: …

脑电波控制设备:基于典型相关分析(CCA)的脑机接口频率精准解码方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、CCA的用途二、频率求解思路三、输入数据结构四、判断方法五、matlab实践1.数据集获取及处理2.matlab代码3.运行及结果 六、参考文献 前言 在脑机接口(BCI)领…

fiddler+雷电模拟器(安卓9)+https配置

一、fiddler配置 1、开启https代理 2、根证书安装:导出证书系统安装 二、模拟器设置 1、设置网络桥接模式 【点击安装】提示安装成功后保存即可 2、开启root(开启adb远程调试) 3、开启磁盘写入 4、设置WLAN代理 5、证书安装:物…

跨越时空的对话:图灵与GPT-4聊AI的前世今生

(背景:虚拟咖啡厅,图灵身着1950年代西装,端着一杯热茶,GPT-4以全息投影形态坐在对面) 图灵(喝了口茶):“听说你能写诗?我当年在布莱切利园破解Enigma时&…

双击PPT文件界面灰色不可用,需要再次打开该PPT文件才能正常打开

双击PPT文件界面灰色不可用,需要再次打开该PPT文件才能正常打开 1. 软件环境⚙️2. 问题描述🔍3. 解决方法🐡解决步骤 4. 结果预览🤔 1. 软件环境⚙️ Windows10 或 Windows11 专业版64位,安装MotionGo软件&#xff08…

【时间序列聚类】Feature-driven Time Series Clustering(特征驱动的时间序列聚类)

文章目录 1.文章介绍2.问题背景3.拟解决的问题4.主要贡献5.提出的方法5.1模型pipeline5.2特征抽取和选择5.3图渲染和社区检测5.4共现矩阵的构建5.5对共现矩阵进行聚类 6.实验6.1模型设置6.2实验结果6.3消融实验 7.结论8.个人观点9.Reference 1.文章介绍 论文出处:ED…

tomcat负载均衡配置

这里拿Nginx和之前做的Tomcat 多实例来实现tomcat负载均衡 1.准备多实例与nginx tomcat单机多实例部署-CSDN博客 2.配置nginx做负载均衡 upstream tomcat{ server 192.168.60.11:8081; server 192.168.60.11:8082; server 192.168.60.11:8083; } ser…

SQLAlchemy系列教程:如何执行原生SQL

Python中的数据库交互提供了高级API。但是,有时您可能需要执行原始SQL以提高效率或利用数据库特定的特性。本指南介绍在SQLAlchemy框架内执行原始SQL。 在SQLAlchemy中执行原生SQL SQLAlchemy虽然以其对象-关系映射(ORM)功能而闻名&#xff…

19.HarmonyOS Next CustomSlider组件基础教程(一)

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 1. 组件介绍 Slider(滑动选择器)是HarmonyOS中常用的交互组件,用于在给定的数值范围内进行连续值的选择。本教…

管中窥豹数字预失真(DPD)

管中窥豹数字预失真(DPD) 数字预失真在通信领域发挥了巨大的作用,对提高功放效率、改善误码率起了不可忽略的作用,广泛运用与通信、雷达等各种领域。但是对于普通用户,它显得及其高深神秘。今天就用这个短文&#xff…

MCP极简入门:超快速上手运行简单的MCP服务和MCP客户端

MCP是什么? 首先我们快速过一下MCP的基本概念,接着我们会通过一个简单的天气服务的教程,来上手学会使用MCP服务和在主机运行服务。本文根据官方教程改编。 1. MCP的基本概念 MCP(Model Context Protocol,模型上下文…

DeepSeek进阶应用(一):结合Mermaid绘图(流程图、时序图、类图、状态图、甘特图、饼图)

🌟前言: 在软件开发、项目管理和系统设计等领域,图表是表达复杂信息的有效工具。随着AI助手如DeepSeek的普及,我们现在可以更轻松地创建各种专业图表。 名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者&…

海康线扫相机平场矫正教程

0、平场矫正前的准备确认 1、白纸准备 确保视野中有一张平整且无折痕的白纸,使其完全铺满相机的整个视野。 2、行高设置 将行高参数设定为 2048。 3、灰度值控制 相机端图像的灰度值应维持在 120 - 180 这个区间内。同时,最亮像素点与最暗像素点的灰度…

数智读书笔记系列015 探索思维黑箱:《心智社会:从细胞到人工智能,人类思维的优雅解读》读书笔记

引言 《The Society of Mind》(《心智社会》)的作者马文・明斯基(Marvin Minsky),是人工智能领域的先驱和奠基者之一 ,1969 年获得图灵奖,被广泛认为是对人工智能领域影响最大的科学家之一。他…

游戏引擎学习第148天

回顾并规划今天的工作 没有使用引擎,也没有任何库支持,只有我们自己,编写游戏的所有代码,不仅仅是小小的部分,而是从头到尾。现在,我们正处于一个我一直想做的任务中,虽然一切都需要按部就班&a…

bug-Ant中a-select的placeholder不生效(绑定默认值为undefined)

1.问题 Ant中使用a-select下拉框时,placeholder设置输入框显示默认值提示,vue2ant null与undefined在js中明确的区别: null:一个值被定义,定义为“空值” undefined:根本不存在定义 2.解决 2.1 a-select使…

DeepSeek教我写词典爬虫获取单词的音标和拼写

Python在爬虫领域展现出了卓越的功能性,不仅能够高效地抓取目标数据,还能便捷地将数据存储至本地。在众多Python爬虫应用中,词典数据的爬取尤为常见。接下来,我们将以dict.cn为例,详细演示如何编写一个用于爬取词典数据…

springboot-自定义注解

1.注解的概念 注解是一种能被添加到java代码中的【元数据,类、方法、变量、参数和包】都可以用注解来修饰。用来定义一个类、属性或一些方法,以便程序能被捕译处理。 相当于一个说明文件,告诉应用程序某个被注解的类或属性是什么&#xff0c…

低代码开发直聘管理系统

低代码 DeepSeek 组合的方式开发直聘管理系统,兼职是开挂的存在。整个管理后台系统 小程序端接口的输出,只花了两个星期不到。 一、技术栈 后端:SpringBoot mybatis MySQL Redis 前端:Vue elementui 二、整体效果 三、表结…