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,今天就写这么多吧
纯手敲 原创不易,如果觉得对你有帮助,可以关注一下,打赏一下,感谢

相关文章:
mysql的Innodb最大支持的索引长度是多少,以及索引长度怎么计算
今天正好有空,来讲个之前粉丝经常问的一个知识,就是mysql的Innodb最大支持的索引长度是多少?以及索引长度怎么计算? 一、mysql的innodb引擎,创建索引最大支持的长度是多少字节? 不墨迹,直接说…...
Android Compose: `remember` 与 `ViewModel` 保存数据的优缺点对比
在开发 Android 应用时,管理 UI 状态是一个不可避免的话题。Jetpack Compose 提供了两种常见的方式来保存和管理数据:remember 和 ViewModel。它们各有优缺点,适用于不同的场景。 本文将详细对比这两者在保存数据时的优缺点,帮助…...
vue3+vite模式下修改pinia的stroe初始值不进行热HMR更新解析
原因: import { defineStore } from pinia interface CounterState {count: number;name: string; } export const useCounterStore defineStore(counter, {state: () > ({ count: 10, name: Eduardo }),getters: {doubleCount: (state:CounterState) > st…...
【一句话经验】ubuntu vi/vim 模式自动设置为paste
从centos过来,发现ubutun有些地方不习惯,尤其是vi的粘贴,默认自动进去了代码模式,导致每次粘贴必须得set paste,否则会出现问题。 解决办法非常简单,按照下面命令执行即可: cd ~ echo "…...
[杂学笔记] TCP和UDP的区别,对http接口解释 , Cookie和Session的区别 ,http和https的区别 , 智能指针 ,断点续传
文章目录 1. TCP和UDP的区别2. 对http接口解释3. Cookie和Session的区别4. http和https的区别5. 智能指针6.断点续传 1. TCP和UDP的区别 tcp的特点: 面向连接,可靠性高,全双工,面向字节流udp特点:无连接,不…...
训练大模型LLM选择哪种开发语言最好
训练大型语言模型(LLM)时,选择合适的编程语言主要取决于效率、生态支持、开发便利性以及特定需求(如性能优化或硬件适配)。以下是常见语言的分析和推荐: --- 1. Python(首选语言) 优…...
Jupyter Notebook 全平台安装与配置教程(附Python/Anaconda双方案)
一、软件定位与特性 Jupyter Notebook 是交互式编程与数据科学分析工具,支持 40 编程语言,其基于浏览器的「代码块可视化」工作流,已成为机器学习、数据清洗、学术研究的标准环境。核心优势包括: 实时执行代码片段并保存结果支持…...
AutoDL平台租借GPU,创建transformers环境,使用VSCode SSH登录
AutoDL平台租借GPU,创建transformers环境,使用VSCode SSH登录 一、AutoDl平台租用GPU 1.注册并登录AutoDl官网:https://www.autodl.com/home 2.选择算力市场,找到需要的GPU: 我这里选择3090显卡 3.这里我们就选择P…...
【Java篇】行云流水,似风分岔:编程结构中的自然法则
文章目录 Java 程序逻辑控制:顺序、分支与循环结构全面解析一、顺序结构二、分支结构2.1 if 语句2.1.1 基本语法2.1.2 if-else 语句2.1.3 if-else if-else 语句 2.2 switch 语句 三、循环结构3.1 while 循环3.2 break 语句3.3 continue 语句3.4 for 循环 四、输入输…...
2.4 基于Vitest的单元测试基础设施搭建
文章目录 1. 现代单元测试体系解析测试金字塔演进Vitest核心定位2. 基础设施架构设计整体架构图3. 环境配置全流程3.1 基础环境搭建3.2 配置文件`vitest.config.ts`3.3 测试环境初始化4. 测试用例编写规范4.1 基础测试示例4.2 Vue组件测试4.3 异步逻辑测试5. Mock策略深度优化5…...
SqlSugar 进阶之原生Sql操作与存储过程写法 【ORM框架】
系列文章目录 🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀 文章目录 系列文章目录一、前言 🍃二、用法介绍三、方法列表四、使用案例五、调用存储过程六、in参数用法七、SqlServer带Go的脚…...
Navicat Premium(数据库管理工具) v17.1.13 中文 Windows
介绍 Navicat Premium 是一款多功能的数据库管理工具,可以连接并管理主流的数据库系统,如MySQL、PostgreSQL、Oracle、SQL Server等。它提供了丰富的功能和强大的工具,可以帮助用户轻松地管理数据库,进行数据导入导出、查询、备份…...
IDEA(十一)调整新版本的工具栏显示Git操作(pull、commit、push、revert等)
目录 一、背景二、操作步骤2.1 开启新 UI 样式2.2 设置 Tool Window 工具栏 一、背景 好久没有更新 IDEA 了,更新之后发现 IDEA 的工具栏消失了。一番操作之后,终于把 IDEA 的工具栏的设置调整好了,在此进行记录调整步骤,供大家学…...
QoS质量配置
他们祝你挺拔,再挺拔一点;我只祝你,永远年少,永远一骑当先. 1. QoS的概念 QoS(服务质量)是指一个网络能够利用各种各样的基础技术向选定的网络通信提供更好 的服务的能力。这些基础技术包括:帧中继(FrameR…...
2024年群智能SCI1区TOP:混沌可行性恢复粒子群算法CEPSO,深度解析+性能实测
目录 1.摘要2.改进策略3.结果展示4.参考文献5.代码获取 1.摘要 本文研究了解决二阶段非线性固定费用运输问题(Two-stage NFCTP),该问题的特点是每条运输弧线都与固定费用和与运输量的平方成正比的变量费用相关联。由于涉及固定费用和非线性组…...
ORACLE EBS数据库RELINK方式搭建克隆环境
ORACLE EBS系统的数据库,一般都安装了很多特定功能的小补丁来解决特定的BUG;因此对于已经安装好的系统,想要克隆一套测试环境、搭建一个新的备机做测试等,如果按照生产环境标准,则需要安装大量补丁,带来很大…...
第十五届蓝桥杯省赛电子类单片机学习过程记录(客观题)
客观试题: 01.典型的BUCK电源电路包含哪些关键器件(ABCD) A. 电容 B. 二极管 C. 电感 D. MOSFET 解析: 典型的 BUCK 电源电路是一种降压型的直流-直流转换电路,它包含以下关键器件: A.电容:电容在电路中起到滤波的作用。输入电容用于平滑输入电压的波动,减少电源噪声对…...
使用 invideo ai 实现文生视频
https://ai.invideo.io 然后选ai生成视频 输入描述,点击生成 就可以得到视频了,可以下载...
5G技术与物联网融合:未来智慧城市的基石
一、智慧城市演进:从概念到落地的技术革命 1.1 全球智慧城市发展现状 2023年全球智慧城市市场规模突破$1.2万亿美元,中国以35%的占比领跑市场(数据来源:IDC)。典型应用成效: 交通效率:新加坡…...
蓝桥杯备赛-差分-重新排序
问题描述 给定一个数组 AA 和一些查询 Li,RiLi,Ri, 求数组中第 LiLi 至第 RiRi 个元素之和。 小蓝觉得这个问题很无聊, 于是他想重新排列一下数组, 使得最终每个查 询结果的和尽可能地大。小蓝想知道相比原数组, 所有查询结果的总和最多可 以增加多少? 输入格式 输…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
