今天正好有空,来讲个之前粉丝经常问的一个知识,就是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.pswp.cn/bicheng/72909.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/72909.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/72909.shtml

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

相关文章

Python 中 `sort()` 和 `sorted()` 的用法与区别

Python 中 sort() 和 sorted() 的用法与区别 1. sort() 方法: sort() 是 Python 列表类型 (list) 的一个方法,它用于就地(原地)排序列表,修改原始列表。排序时可以通过 key 参数指定排序依据,还可以通过 …

SpringBoot过滤器(Filter)的使用:Filter接口、FilterRegistrationBean类配置、@WebFilter注释

1、过滤器(Filter)的介绍 Spring Boot 的过滤器用于对数据进行过滤处理。通过 Spring Boot 的过滤器,程序开发人员不仅可以对用户通过 URL 地址发送的请求进行过滤处理(例如:过滤一些错误的请求或者请求中的敏感词等),而且可以对服务器返回的数据进行过滤处理(例如:压…

C++修炼之路:初识C++

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 引言 …

【STM32MP157系统移植】3.TF-A目录结构

bl1&#xff1a;部分一般不用TFA自带的&#xff0c;而是芯片内部的BOOTROM bl2&#xff1a;更像传统意义的TF-A&#xff0c;TF-A本身 bl31&#xff1a;是ARMV&#xff18;的EL3运行时固件 bl32&#xff1a;OPTEE或者TF-A提供的sp_min bl33&#xff1a;就是uboot 真正需要移…

OpenCV连续数字识别—可运行验证

前言 ​ 文章开始&#xff0c;瞎说一点其他的东西&#xff0c;真的是很离谱&#xff0c;找了至少两三个小时&#xff0c;就一个简单的需求&#xff1a; 1、利用OpenCV 在Windows进行抓图 2、利用OpenCV 进行连续数字的检测。 3、使用C&#xff0c;Qt 3、将检测的结果显示出来 …

shell的模拟实现 ─── linux第16课

在shell的命令行中输入命令,会有两种执行命令的途径 shell自己执行 shell创建子进程(fork ,exit ,waitpid,exec) ,子进程去执行 shell自己执行的命令是自建命令(bulit command) 子进程执行的是非自建命令 第一版只能维护命令行参数表创建子进程, 执行非内建命令 我们先创…

MySQL创建数据库和表,插入四大名著中的人物

一、登录数据库并创建数据库db_ck 二、创建表t_hero 表属性包括&#xff08;id&#xff0c;name&#xff0c;nickname&#xff0c;age&#xff0c;gender&#xff0c;address&#xff0c;weapon&#xff0c;types&#xff09; mysql> create table t_hero(-> id int,-…

静态网页的爬虫(以电影天堂为例)

一、电影天堂的网址&#xff08;url&#xff09; 电影天堂_免费电影_迅雷电影下载_电影天堂网最好的迅雷电影下载网&#xff0c;分享最新电影&#xff0c;高清电影、综艺、动漫、电视剧等下载&#xff01;https://dydytt.net/index.htm 我们要爬取这个页面上的内容 二、代码…

【C++】:STL详解 —— 红黑树封装map和set

目录 红黑树的源代码 正向迭代器的代码 反向迭代器的代码 set的模拟实现 map的模拟实现 红黑树的源代码 #pragma once #include <iostream>using namespace std; // set ->key // map ->key/value// set ->key // map ->key/valueenum Colour {RED,BLAC…

MATLAB控制函数测试要点剖析

一、功能准确性检验 基础功能核验 针对常用控制函数&#xff0c;像用于传递函数建模的 tf 、构建状态空间模型的 ss &#xff0c;以及开展阶跃响应分析的 step 等&#xff0c;必须确认其能精准执行基础操作。以 tf 函数为例&#xff0c;在输入分子与分母系数后&#xff0c;理…

MoonSharp 文档一

目录 1.Getting Started 步骤1&#xff1a;在 IDE 中引入 MoonSharp 步骤2&#xff1a;引入命名空间 步骤3&#xff1a;调用脚本 步骤4&#xff1a;运行代码 2.Keeping a Script around 步骤1&#xff1a;复现前教程所有操作 步骤2&#xff1a;改为创建Script对象 步骤…

ROS云课三分钟-差动移动机器人导航报告如何撰写-及格边缘疯狂试探

提示词&#xff1a;基于如上所有案例并结合roslaunch teb_local_planner_tutorials robot_diff_drive_in_stage.launch和上面所有对话内容&#xff0c;设计一个差速移动机器人仿真实验&#xff0c;并完成报告的全文撰写。 差速移动机器人导航仿真实验报告 一、实验目的 验证 T…

ACE协议学习1

在多核系统或复杂SoC&#xff08;System on Chip&#xff09;中&#xff0c;不同处理器核心或IP&#xff08;Intellectual Property&#xff09;模块之间需要保持数据的一致性。常用的是ACE协议or CHI。 先对ACE协议进行学习 ACE协议&#xff08;Advanced Microcontroller Bu…

ajax之生成一个ajax的demo示例

目录 一. node.js和express ​二. 使用express创建后端服务 三. 创建前端 一. node.js和express ajax是前端在不刷新的情况下访问后端的技术&#xff0c;所以首先需要配置一个后端服务&#xff0c;可以使用node.js和express。 首先生成一个空项目&#xff0c;新建main目录…

Java 字节码操纵框架 -ASM

Java 字节码操纵框架 -ASM 1.ASM 概述: ASM 是用于 Java 字节码操纵的框架,可动态生成新类或增强现有类的功能。它既能直接产生二进制 class 文件,也能在类被加载到虚拟机之前动态改变类行为,通过读取类文件信息来分析、修改类行为,甚至生成新类。许多流行框架如 cglib、…

kafka + flink +mysql 案例

假设你有两个Kafka主题&#xff1a;user_activities_topic 和 product_views_topic&#xff0c;并且你希望将user_activities_topic中的数据写入到user_activities表&#xff0c;而将product_views_topic中的数据写入到product_views表。 maven <dependencies><!-- …

远程登录客户端软件 CTerm 发布了 v4.0.0

有时候我们需要远程登录到 Linux/Unix 服务器&#xff0c;这方面使用最广泛的客户端软件是 PuTTY&#xff0c;不过它是全英文的&#xff0c;而且是单窗口的&#xff0c;有时候显得不那么方便。 CTerm (Clever Terminal) 是一个 Windows 平台下支持 Telnet 和 SSH 协议进行远程…

从李佳琦团队看新型用工:灵活就业如何重构组织架构?

2022年“双11”期间&#xff0c;李佳琦直播间累计销售额突破115亿元&#xff08;来源&#xff1a;新腕数据《2022双11直播电商战报》&#xff09;&#xff0c;其背后团队规模约400人&#xff0c;但全职员工仅占35%&#xff0c;其余65%为外包选品团队、兼职客服、第三方MCN机构人…

微软程序的打包格式MSIX

MSIX 微软推出的MSIX格式是其为统一Windows应用程序打包和部署而设计的新一代安装包格式&#xff0c;具有以下核心特点和进展&#xff1a; 1. 推出背景与时间线 MSIX最初于2018年在微软Build大会上宣布&#xff0c;并在同年7月发布预览版打包工具&#xff0c;10月正式版上线…

AFL++安装

学习fuzzing也几天了&#xff0c;今天记录AFL的安装及使用 一、实验环境 虚拟机&#xff1a;ubuntu20.04 当然也可以uname -a去看自己的版本号 二、AFL安装 1.先更新一下工具 sudo apt update2.安装AFL必要的一些依赖&#xff0c;例如编译工具&#xff08;如 build-essen…