天天看點

如何精确計算mysql的索引長度

一、前言

MySQL Innodb 對于索引長度的限制為 767 位元組,并且UTF8mb4字元集是4位元組字元集,則 767位元組 / 4位元組每字元 = 191字元(預設索引最大長度),是以在varchar(255)或char(255) 類型字段上建立索引會失敗,提示最大索引長度為767位元組。

二、環境準備

建立表

建立聯合索引

三、試驗

語句1的執行計劃為:

如何精确計算mysql的索引長度

 語句2的執行計劃為:

如何精确計算mysql的索引長度

檢視表的索引

如何精确計算mysql的索引長度

将組合索引想成書的一級目錄、二級目錄、三級目錄,如index(a,b,c),相當于a是一級目錄,b是一級目錄下的二級目錄,c是二級目錄下的三級目錄。要使用某一目錄,必須先使用其上級目錄,除了一級目錄除外。

是以

where a=1 and c=1隻使用了一級目錄,c在三級目錄,沒有使用二級目錄,那麼三級目錄就沒法使用

where a=1 and b=1隻使用了一級目錄、二級目錄。

于是第二條查詢的key_len更大。

但是,具體key_len怎麼計算的,上面怎樣計算出是4和8的呢?

SQL1

執行計劃:

如何精确計算mysql的索引長度

key_len = 4 (a是int類型 4位元組) = 4

是以得出結論,是命中了索引列a

SQL2

如何精确計算mysql的索引長度

key_len =4 (a是int類型 4位元組) + 4(b是int類型 4位元組)  = 8

是以得出結論,是命中了索引列a和索引列b

四、再實驗

sql為:

 執行計劃為:

 key_len =4 (id是int類型 4位元組) + 5(name是varcharr類型 5位元組)*1(字元集是latin1)+變列長2  = 11

知道、想到、做到、得到