一、介绍
explain可以分析一条sql的优劣,通过mysql反馈我们,需要我们自己去读懂explain的sql执行结果来判断是否要进行优化,根据不同的业务和操作的数据量大小优化。
二、使用explain
mysql下执行:explain sql语句,比如 explain select t2.* from table2 t2;
返回结果显示
三、explain执行结果字段分析说明
1、通过id分析表的读取顺序,sql为:explain select t2.* from t1,t2,t3 where t1.id=t2.id and t1.id=t3.id and t1.other_column ='';
id:相同,执行顺序由上而下
id:不相同,子查询id序号递增,id值越大优先级越高,越先被执行。
sql为:explain select t2.* from t2 where id=(select id from t1 where id=(select t3.id from t3 where t3.other_column=''));
id:相同不同,id相同,可能认为是一组,从上往下顺序执行
id值越大,优先级越高
sql为:explain select t2.*from (select t3.id from t3 where t3.other_column='') s1,t2 where s1.id=t2.id;
2、select_type类型说明
【simple表示简单的select查询,查询语句不包含子查询或union】
【primary表示查询中包含复杂子部分,最外层查询标记为primary】
【subquery表示在select或where列表包含子查询】
【derived表示在from列表包含子查询被标记为衍生derived,mysql会递归这些子查询,把结果放到临时表里】
【出现第二个select出现在union之后,则被标记为union。若union包含在from子句的子查询中,外层select被标记为derived】
【union result从union表获取结果的select】
3、type:显示查询使用了何种类型【system>const>eq_ref>ref>range>index>ALL
4、Possible_keys:2个索引条件查询mysql,mysql自己可能用不到2个(实际中)
5、Key:实际使用到的索引,null就没有,查询到使用了覆盖索引,则该索引仅出现在key列表中
6、Key_len:表示索引中使用的字节数,可通过该列计算查询中使用索引的长度,不损失精度下越短越好,key_len显示的值为索引字段的最大可能长度,不是实际使用长度,查询条件越多越精确,但产生key长度越长
7、Ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查询索引列上的值
8、Rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数(读取行判断有多少行被优化)
9、Extra
9.1、using filesort:mysql会对数据使用一个外部的索引排序,不是按照表内索引顺序读取,mysql中无法利用索引完成的排序操作叫文件排序(言外之意:没有按照内部规则执行,mysql另起炉灶排序,危险)
9.2、using temporary:使用临时表保存中间结果,mysql对查询结果排序使用临时表,常见于排序order by和分组查询gourp by,多索引情况,排序规则最好按照索引个数和顺序使用
9.3、using index:
覆盖索引:复合索引c1、c2,刚好查询的select c1,c2,就不用去读取数据行,直接从索引上取得数据(或一部分满足)
9.4、using where:使用了where过滤
9.5、using join buffer:使用了连接缓存
9.6、impossible where:
9.7、select tables optimized away:
9.8、distinct: