MySQL explain 中 key_len的詳解

haoge0205發表於2020-04-07

MySQL explain中key_len的計算

key_len表示索引使用的位元組數,根據這個值可以判斷索引的使用情況,特別是在組合索引的時候,判斷該索引有多少部分被使用到非常重要。

在計算key_len時,下面是一些需要考慮的點:

索引欄位的附加資訊:

1.可以分為變長和定長資料型別討論;

2.當索引欄位為定長資料型別時,如char,int,datetime,需要有是否為空的標記,這個標記佔用一個位元組(對於not null來說不需要這一個位元組);

3.當索引欄位為變長資料型別時,如varchar,除了是否為空的標記外,還需要有長度資訊,需要佔用兩個位元組;

4.對於char,varchar,blob,text等,key_len的長度還和字符集有關,latin1 一個字元佔用一個位元組,gbk 一個字元佔用兩個位元組,utf8 一個字元佔用三個位元組

例如:

列型別          KEY_LEN                        備註

id int                 key_len = 4+1                 int為4bytes,允許為NULL,加1byte

id bigint not null key_len=8                 bigint為8bytes

user char(30) utf8 key_len=30*3+1         utf8每個字元為3bytes,允許為NULL,加1byte

user varchar(30) not null utf8 key_len=30*3+2 utf8每個字元為3bytes,變長資料型別,加2bytes

user varchar(30) utf8 key_len=30*3+2+1 utf8每個字元為3bytes,允許為NULL,加1byte,變長資料型別,加2bytes

detail text(10) utf8 key_len=30*3+2+1        TEXT擷取部分,被視為動態列型別

備註:

key_len只表示了where中用於條件過濾時被選中的索引列,是不包含order by / group by 這一部分被選中的索引列的。

例如:

有一個聯合索引idx(a1,b2,c3),三列均是 int not null,那麼下面的執行計劃中key_len的值是8,不是12

select .... from table where c1=? and c2=? order by c1;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28939273/viewspace-2684894/,如需轉載,請註明出處,否則將追究法律責任。

相關文章