explain語句中的key len計算

2021-08-08 19:32:27 字數 1954 閱讀 1746

有時候表中有聯合索引時,我們想確定我們的sql使用了幾個索引字段,這時候就可以用explain檢視該sql的key_len,然後通過key_len的值來判斷該sql使用了幾個索引字段。 

假設有如下表:

create

table

`tblgameremain` (

`id`

int(11) not

null auto_increment primary

key,

`recdate`

date

notnull

default

'0000-00-00',

`device`

varchar(10),

`area`

varchar(10) not

null

default

'', `platform`

varchar(20) not

null

default

'', `gamesrc`

varchar(10) not

null

default

'', `sid`

varchar(10) not

null

default

'', `kpi`

varchar(50) not

null

default

'', `kpivalue`

int(11) not

null

default

'0',

`remain`

int(11) not

null

default

'0',

unique

key(`recdate`,`device`,`area`,`platform`,`gamesrc`,`sid`,`kpi`)

) engine=innodb default charset=utf8

如果我們想知道如下sql中的sid是否使用了索引:

select * from tblgameinfo where recdate='2015-11-11'

and device='cn'

and sid='s1';

我們可以用explain,然後通過返回的key_len來判斷

explain select * from tblgameinfo where recdate='2015-11-11'

and device='cn'

and sid='s1';

執行後發現,key_len的值為36。那麼,key_len的值是怎麼算的呢? 

它的規則如下:

所有的索引字段,如果沒有設定not null,則需要加乙個位元組。

定長字段,int佔四個位元組、date佔三個位元組、char(n)佔n個字元。

對於變成欄位varchar(n),則有n個字元+兩個位元組。

不同的字符集,乙個字元占用的位元組數不同。latin1編碼的,乙個字元占用乙個位元組,gbk編碼的,乙個字元占用兩個位元組,utf8編碼的,乙個字元占用三個位元組。

我們再看一下上述的sql,根據聯合索引的最左匹配原則,所以,如果sid使用了索引,那麼recdate和device也一定使用了。首先是recdate,由於它是date型的,而且加上了not null所以key_len為3。其次是device,由於它是varchar(10),但是沒有加上not null,而且是utf8編碼的,所以它的key_len=10 * 3 + 2 + 1 = 33,所以recdate和device這兩個欄位就占用了3 + 33 = 36個位元組,而且explain中的key_len=36,所以可以判斷sid沒有使用索引。 

(注:本文主要是想說明key_len的計算,如果想判斷上述sql的sid是否使用索引,更加最左匹配原則就可以知道答案)

for語句中的 和

for int i 0 i 100 i 和for int i 0 i 100 i 是程式設計中常用的兩個語句,這兩個語句看似作用類似但實際上在使用中卻容易產生很多意想不到的問題 入下例 這段 是用歸併排序演算法對陣列進行排序,在merge函式中有三個for語句,如果使用 和使用 會嘗試完全不同的結果...

Sql語句中的DDL語句

資料庫模式定義語言ddl data definition language 是用於描述資料庫中要儲存的現實世界實體的語言。主要由create 新增 alter 修改 drop 刪除 和 truncate 刪除 四個關鍵字完成。create database 資料庫名 建立乙個資料庫 create d...

Explain分析查詢語句

表的讀取順序 讀取操作的型別 可用索引,實際使用的索引 表之間的引用 每張表多少行被優化器查詢 索引的長度 explain欄位解釋 table 顯示這一行的資料是關於哪張表的 possible keys 顯示可能應用在這張表中的索引。如果為空,沒有可能的索引。可以為相關的域從where語句中選擇乙個...