這片文章介紹了key_len參數值的計算方法
我再此稍微擴展下,如有雷同實屬榮幸
key_len是表示得到結果集所使用的選擇的索引的長度,但不包括order by,也就是說,如果order by也使用了索引則key_len則不計算在內
帖代碼
SELECT t. * FROM tb_1 t FORCE INDEX ( idx_fid_dis_la ) WHERE t.fid = '6572' ORDER BY t.dis DESC , t.la DESC LIMIT 100 , 40
執行計划
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t ref idx_fid_dis_la idx_fid_dis_la 2 const 147 Using where
注:fid: 2byte dis:1byte la:4byte
不像上邊那樣使用聯合索引
SELECT t. * FROM tb_1 t WHERE t.fid = '6572' ORDER BY t.dis DESC , t.la DESC LIMIT 100 , 40
執行計划:
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t ref typeid typeid 2 const 127 Using where; Using filesort
注意這里extra里有了Using filesort,但用到的索引的長度仍然是2byte,也就是說得到結果只用到了fid字段,而order by 時沒用到索引
總結:在得到結果但沒將結果排序這一步時都只利用了fid,但是上一個索引(idx_fid_dis_la )里有order by可利用的字段,而下一個索引里沒有
雖然上一句中的order by用到了索引但是沒有計算到key_len中
走啦,趕不上車了,如有不對之處,敬請提出