index-D
key_len
表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度。在不損失精確性的情況下,長度越短越好
key_len顯示的值為索引字段的最大可能長度,并非實際使用長度,即key_len是根據表定義計算而得,不是通過表內檢索出的
難點:如何計算的?
官網解釋
數據類型長度
數值類型
日期和時間類型
datetime類型在5.6中字段長度是5個字節,
datetime類型在5.5中字段長度是8個字節
字符串類型
計算方法估值表
key_len表示索引使用的字節數,
根據這個值,就可以判斷索引使用情況,特別是在組合索引的時候,判斷所有的索引字段是否都被查詢用到。
char和varchar跟字符編碼也有密切的聯系,
latin1占用1個字節,gbk占用2個字節,utf8占用3個字節。(不同字符編碼占用的存儲空間不同)
案例演示
字符型
索引字段為char類型+不可為Null時
CREATE TABLE `t2` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` char(10) NOT NULL,`addr` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`),KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; explain select * from t2 where name='leon';索引字段為char類型+允許為Null時
CREATE TABLE `t1` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` char(10) DEFAULT NULL,`addr` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`),KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;explain select * from t1 where name='leon';索引字段為varchar類型+不可為Null時
CREATE TABLE `t4` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(10) NOT NULL,`addr` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`),KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;explain select * from t4 where name='leon';變長字段需要額外的2個字節(VARCHAR值保存時只保存需要的字符數,另加一個字節來記錄長度(如果列聲明的長度超過255,則使用兩個字節),所以VARCAHR索引長度計算時候要加2)
索引字段為varchar類型+允許為Null時
CREATE TABLE `t3` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(10) DEFAULT NULL,`addr` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`),KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;explain select * from t3 where name='leon';整數/浮點數/時間類型的索引長度
整數類型,浮點數類型,時間類型的索引長度
NOT NULL=字段本身的字段長度
NULL=字段本身的字段長度+1(因為需要有是否為空的標記,這個標記需要占用1個字節)
datetime類型在5.6中字段長度是5個字節,datetime類型在5.5中字段長度是8個字節
ref
顯示索引的哪一列被使用了,如果可能的話,是一個常數。哪些列或常量被用于查找索引列上的值
由key_len可知t1表的idx_col1_col2被充分使用,col1匹配t2表的col1,col2匹配了一個常量,即 'ac'
查詢中與其它表關聯的字段,外鍵關系建立索引
rows
根據表統計信息及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數
?
總結