key_len的作用是看索引哪些欄位被用到,具體來說是看聯合索引。因為索引只有乙個字段的話,你直接看key就行了。
聯合索引有很多字段,哪些用到索引,哪些沒有,explain裡面有key_len可以幫助我們分析。key_len的長度,可以計算出來哪些欄位被使用。
下面講些常用的字段的占用空間計算規則,
一般來講,key_len的值=字段長度*這個型別的字段所佔空間(位元組),這個單位是位元組。
但是僅僅知道這個規則計算的時候經常是錯誤的,我們還要考慮字段型別,mysql版本,是否允許為空,是否可變長度,還有字元編碼集。
int 型別占用4個位元組
char 乙個位元組
varchar 3個位元組
datatime 5~8個位元組
當知道字段執行為空的時候,底層需要乙個位元組標註這個欄位的空約束。而不允許為空的時候不需要標註,因為不允許為空是預設的。
當字串是可變長度型別的時候,varchar就是這個型別。那麼除了空約束以為,還有可變長度這個約束占用2個位元組。
再比如,datatime在mysql5.6是5個位元組,可是在5.5是8個位元組。
下面具體計算一下:
int id(10) not null key_len=104
int id(10) not null unsigned key_len=104
int id(10) key_len=104+1
varchar(10) not null key_len=103+2 2是可變長度
varchar(10) key_len=103+2+1
char(10) key_len=101+1
char(10) not null key_len=10*1
補充一下,unsigned不占用位元組空間
總結:影響key_len長度的可變長度,允許為空,版本,字段型別
explain語句中的key len計算
有時候表中有聯合索引時,我們想確定我們的sql使用了幾個索引字段,這時候就可以用explain檢視該sql的key len,然後通過key len的值來判斷該sql使用了幾個索引字段。假設有如下表 create table tblgameremain id int 11 not null auto ...
sql基於座標計算距離的優化
如題,下面是最初版的sql,取與目標座標150千公尺範圍內的記錄 select top 10 from t temple a with nolock where dbo.fngetdistance 37.356976,116.8425,lat,lon 150 order by a.id asc 因為...
18 SQL優化 其他SQL的優化
定期分析表,檢查表,優化表 analyze local no write to binlog table table name table name1 本語句用於分析和儲存表的關鍵字分布,執行一次分析表,在分析期間使用乙個讀取鎖定。這對於myisam,bdb 和innodb 表有作用,對於 myis...