5) possible_keys
该字段的值是可能被MySQL用作索引的字段,若值为NULL,则没有字段会被用作索引,因此查询效率不会高,这种情况下,需要优化数据表的索引结构。
6) key
该字段的值是MySQL真正用到的索引。
值得注意的是:该字段的值有可能不是possible_keys列出的候选索引字段,例如,当前查询SQL要返回的字段是数据表某索引字段的最左前缀匹配字段,但SQL的where条件中没有使用数据表的索引字段,则此时possible_keys可能为NULL,而key字段的值可能是那个能cover住待查询字段的数据表索引字段,此时,MySQL会扫描索引树,虽然低效,但比起扫描全表还是要快。这种场景也正是本文前面解释join_type='index'时提到的case1。
此外,在select语句中借助"force index或"use index"可以强制MySQL使用possible_keys中列出的候选索引字段。
7) key_len
该字段的值表明上述key字段的length,当MySQL将某联合索引字段作为SQL执行时用到的索引时,key_len字段可以暗示MySQL真正在什么程度上(多长的最左前缀匹配字段)使用了该联合索引。若key字段的值为NULL,则key_len字段值也为NULL。
8) ref
该字段的值表明数据表中的哪列或哪个constants会被用于与key字段指定的索引做比较。
该字段的值表明MySQL执行该步计划对应的query时必须扫描的行数。 这个值对于SQL优化非常具有参考意义,通常情况下,该值越小查询效率越高。
10) Extra
该字段的值包含了MySQL执行query时的其它额外信息。该字段可能的取值情况较多,详细情况可参考官网文档的说明。
除explain外,MySQL还支持explain extended命令来分析optimizer的执行计划,后者在输出结果中多1个filtered字段,且可以用show warnings语句来分析输出的extra信息。
3. 如何根据explain的输出优化SQL如果理解了explain输出结果中每个字段背后的含义,则据此优化SQL性能会变得高效且有依据。
在工程实践中利用explain来trouble shoot低效SQL的思路,跟工程师的经验和能力有关,这里推荐几篇技术资料来抛砖引玉。
1) Oreilly官网中的一篇PDF分享:Explain Demystified
2) slideshare上的一篇分享文档:Mysql Explain Explained,该文档循序渐进地解释了MySQL explain的输出及据此优化SQL的典型思路,值得一读。
3) 美团官方技术博客的一篇文章:MySQL索引原理及慢查询优化,文中介绍了B+Tree的原理,并给出了几个利用explain来优化SQL的工程场景,也值得精读。