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.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…