在进行mysql语句调优的过程中,一般是会通过慢查询日志来查看查询速度较慢的sql语句,定位到这些sql语句之后,通过explain命令来查看sql语句的执行策略,explain命令可以显示一条sql语句的执行策略。
对一条语句执行explain以后,通常我们关心的是explain语句中的一些重要字段,它们分别是type,key和extra。通过查看key是否为null以得知这条sql语句是否走了索引,然后根据type和extra的信息来综合分析这条慢sql的慢的原因。
type:
type字段表示这条sql语句的执行效率等级,一共有8个等级,如何理解记忆这个等级呢,实际上,可以根据不同type所返回的record(记录)数来把这8个等级分为三档,我把它们分为single record、serveral recoreds和more records。
single record中,除了system是const的特殊情况外,其他两个级别都是使用了主键或者唯一索引的所有字段去定位了一条唯一的数据,效率高。
serveral records中,返回的都是若干条数据,从ref到range,理论上来说返回的数据依次增加。
最后是more records,index指扫描了整棵索引树,all是走全表。
通过以上的分类方式可以帮助我们更加深刻地理解记忆type字段。
extra
extra字段是表示这条sql中有一些特殊的情况,同样我把它也分为了三档,分别是不好,好,和其他。
不好的情况对于mysql的性能有一些影响,using filesort表示这条sql没有使用内部索引,使用了文件外部的索引进行排序;using temporary是指在执行过程中产生了中间表,使用group by和order by会有这样的情况发生。
好的情况:using index表示查询过程中使用了覆盖索引,使用覆盖索引可以直接在索引中定位到查询数据,不用回表,效率极高;using index condition指使用联合索引的过程中,有索引下推的现象,帮助查询过程过滤数据。
其他情况,using where表示我们使用where做了条件过滤,一般来说没有使用到索引会出现using where;using join buffer表示进行了连表查询,被驱动的表没有使用到索引,会先把数据放在缓存池中,进而进行遍历查询。