一、前言
MySQL Innodb 對于索引長度的限制為 767 位元組,并且UTF8mb4字元集是4位元組字元集,則 767位元組 / 4位元組每字元 = 191字元(預設索引最大長度),是以在varchar(255)或char(255) 類型字段上建立索引會失敗,提示最大索引長度為767位元組。
二、環境準備
建立表
建立聯合索引
三、試驗
語句1的執行計劃為:

語句2的執行計劃為:
檢視表的索引
将組合索引想成書的一級目錄、二級目錄、三級目錄,如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
執行計劃:

key_len = 4 (a是int類型 4位元組) = 4
是以得出結論,是命中了索引列a
SQL2
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
知道、想到、做到、得到