mysql explain 中key len的計算

2021-09-23 23:31:39 字數 3251 閱讀 2114

今天丁原問我mysql執行計畫中的key_len是怎麼計算得到的,當時還沒有注意,在高效能的那本書講到過這個值的計算,但是自己看執行計畫的時候一直都沒有太在意這個值,更不用說深討這個值的計算了:

ken_len表示索引使用的位元組數,根據這個值,就可以判斷索引使用情況,特別是在組合索引的時候,判斷所有的索引欄位都被查詢用到。

在檢視官方文件的時候,也沒有發現詳細的key_len的計算介紹,後來做了一些測試,在諮詢了丁奇關於變長資料型別的值計算的時候,突然想到innodb 行的格式,在這裡的計算中有點類似,總結一下需要考慮到以下一些情況:

(1).索引欄位的附加資訊:可以分為變長和定長資料型別討論,當索引欄位為定長資料型別,比如char,int,datetime,需要有是否為空的標記,這個標記需要占用1個位元組;對於變長資料型別,比如:varchar,除了是否為空的標記外,還需要有長度資訊,需要占用2個位元組;

(備註:當欄位定義為非空的時候,是否為空的標記將不占用位元組)

(2).同時還需要考慮表所使用的字符集,不同的字符集,gbk編碼的為乙個字元2個位元組,utf8編碼的乙個字元3個位元組;

先看定長資料型別的乙個例子(編碼為gbk):

root@test 07:32:39>create table test_char(id int not null ,name_1 char(20),name_2 char(20),

-> primary key(id),key ind_name(name_1,name_2))engine=innodb charset=gbk;

root@test 07:33:55>insert into test_char values(1,』xuancan』,』taobaodba』);

root@test 07:34:55>explain select * from test_char where name_1=』xuancan』\g;

*************************** 1. row ***************************

id: 1

select_type: ******

table: test_char

type: ref

possible_keys: ind_name

key: ind_name

key_len: 41

ref: const

rows: 1

extra: using where; using index

key_len=41=20*2+1(備註:由於name_1為空,isnull的標記被打上,需要計算1個位元組)

root@test 07:35:31>explain select * from test_char where name_1=』xuancan』 and name_2=』taobaodba』\g;

*************************** 1. row ***************************

id: 1

select_type: ******

table: test_char

type: ref

possible_keys: ind_name

key: ind_name

key_len: 82

ref: const,const

rows: 1

extra: using where; using index

key_len=82=20*2+20*2+1+1(備註:由於name_1,name_2兩列被使用到,但兩列都為為空,需要計算2個位元組)

變長資料型別(gbk編碼):

root@test 08:30:51>create table test_varchar(id int not null ,name_1 varchar(20),name_2 varchar(20),

-> primary key(id),key ind_name(name_1,name_2))engine=innodb charset=gbk;

root@test 08:37:51>insert into test_varchar values(1,』xuancan』,』taobaodba』);

root@test 08:38:14>explain select * from test_varchar where name_1=』xuancan』\g;

*************************** 1. row ***************************

id: 1

select_type: ******

table: test_varchar

type: ref

possible_keys: ind_name

key: ind_name

key_len: 43

ref: const

rows: 1

extra: using where; using index

key_len=43=20*2+1+2(備註:由於為name_1欄位定義為空,所以需要計算1,;同時由於是變長字段varchar,所以需要加上2)

root@test 08:38:46>alter table test_varchar modify column name_1 varchar(20) not null;

query ok, 1 row affected (0.52 sec)

records: 1 duplicates: 0 warnings: 0

root@test 08:42:11>explain select * from test_varchar where name_1=』xuancan』\g;

*************************** 1. row ***************************

id: 1

select_type: ******

table: test_varchar

type: ref

possible_keys: ind_name

key: ind_name

key_len: 42

ref: const

rows: 1

extra: using where; using index

key_len=42=20*2+2(備註由於name_1欄位修改為not null之後,isnull的標記鎖占用的位元組釋放掉,但是變長字段長度所占用的2個位元組沒有釋放);

上面是測試gbk編碼的測試,同時也可以測試一下其他編碼的key_len計算。

Mysql explain中key len的計算

轉 人生不過如此 今天丁原問我mysql執行計畫中的key len是怎麼計算得到的,當時還沒有注意,在高效能的那本書講到過這個值的計算,但是自己看執行計畫的時候一直都沒有太在意這個值,更不用說深討這個值的計算了 ken len表示索引使用的位元組數,根據這個值,就可以判斷索引使用情況,特別是在組合索...

MySQL explain 中key len的計算

key len表示索引使用的位元組數,根據這個值可以判斷索引的使用情況,特別是在組合索引的時候,判斷該索引有多少部分被使用到非常重要。在計算key len時,下面是一些需要考慮的點 索引欄位的附加資訊 1.可以分為變長和定長資料型別討論 2.當索引欄位為定長資料型別時,如char,int,datet...

mysql explain欄位說明

explain列的解釋 id 查詢的序列號 select type select查詢的型別,主要是區別普通查詢和聯合查詢 子查詢之類的複雜查詢。table 所訪問的資料庫中表的名稱。type 這是重要的列,顯示連線使用了何種型別。從最好到最差的連線型別為const eq reg ref range ...