1、看执行计划的好处作为开发者可以通过分析执行计划进而对sql语句进行调优可以解决一些慢查询问题。2、以下分析执行计划的几个比较重要的参数例sql及执行计划如下explain select b.current_period 期数,b.capital_name 还款类别,b.expense 支出,b.estimated_entry_time 计划到账日,b.real_entry_time 实际到账日from invoice_billing bleft join invoice i on b.invoice_id i.idleft join withdrawal_apply w on w.id i.withdrawal_apply_idleft join (select r.*,(ifnull(ri.amount,0)ifnull(ri.checking_amount,0))overdueAmount from refund_apply r left JOIN refund_item ri on r.id ri.refund_apply_id AND ri.capital_typeAOF where (r.statusE or r.statusA or r.statusP or r.statusF) GROUP BY r.invoice_id) ra on b.invoice_id ra.invoice_id WHERE b.validYAND b.invoice_id7 ORDER BY current_period asc ,capital_type。2.1、id: 一组数据表示执行select或操作表的顺序id相同表示同一组执行顺序自上而下其中id越大执行的优先级越高。2.2、select_type:每个select语句查询的类型如simple、primary包含子查询、union等。2.3、type:对表的访问方式表示mysql在表中找到所需行的方式allindexrangerefeq_refconstsystem,越向右越好一般来说查询要至少达到range级别最好可以达到ref,以下逐一介绍各个级别2.3.1、system:表里只有一行数据平时不会出现一般是系统表。2.3.2、const:通常情况将一个主键放置到where后面作为条件查询mysql优化器会将此次查询优化转化为一个常量。2.3.3、eq_ref:唯一索引扫描表中只有一条记录与之匹配。2.3.4、ref:非唯一索引扫描返回匹配某个值的所有行。2.3.5、range:只检索给定范围的行使用一个索引来检索行可以在key列中查看使用的索引一般出现在where语句的条件中如使用between、、、in等查询。2.3.6、index:全索引扫描这种类型只是另外一种形式的全表扫描只不过它的扫描顺序是按照索引的顺序。index和all的区别index只遍历索引树通常比All快因为索引文件通常比数据文件小虽都是全表扫描但index从索引中读取all从磁盘中读取IO操作多-慢。2.3.7、all:全表查找。2.4、possible_keys、key:possible_keys:查询可能用到的索引。key:实际使用到的索引。2.5、key_len:表示索引中使用到的字节数可通过该列计算查询中使用的索引长度显示的是索引字段最大可能长度非实际长度。2.6、rows:根据表统计信息及索引使用情况大致估算找到所需记录所读取的行数。2.7、extra:包含不适合在其他列展示但十分重要的额外信息。2.7.1、using filesort(坏):文件内排序看到这个急需优化了。2.7.2、using temporary(坏)使用临时表保存中间结果mysql在对查询结果的排序中使用了临时表常见于order by和分组查询group by--需要将数据放临时表使用完再把临时表删除很危险急需优化。2.7.3、using index(好)。2.7.4、using where:意味着mysql服务器将在存储引擎检索行后再进行过滤许多where条件里涉及索引中的列当它读取索引时就能被存储引擎检索因此不是所用带where字句的查询都会显示“using where”。有时using where的出现就是一个暗示:查询可受益于不同的索引。欢迎大家指正和分享谢谢~