这片文章介绍了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中
走啦,赶不上车了,如有不对之处,敬请提出