Explain可以检测我们的sql使用性能怎么样,是否有优化的地步。
首先我们要了解mysql查询优化器的执行效率,大约有10个,重点几个主要就是const,ref,range ,index,all。Const效率是最块的,成本可以忽略不计,主要通过主键或者唯一值查询的sql。还有比const更快的system,这种时候必须是mysql优化器内部精确计算查询成本,所以system不适用于innoDB,只适用于myISAM。Ref代表用的是索引b+tree查询的时候,比如用连接查询的时候,连接查询的条件是索引唯一值,这时候还分为eq-ref,er-ef是当被驱动表查询的是主键或者唯一二级索引的时候,这时候就是显示eq-ref。当连接表的条件是普通索引查询的时候,这时候显示就是ref,range顾名思义就是索引区间查询的时候,index代表查询覆盖索引的时候,all就是放弃索引全盘扫描了。
首先我们明白Semi-join使用条件在where或者on后面,必须in布尔组成,而且必须是and连接。
第一个参数是id,理论上几个select就有几个id,但当mysql优化器优化成内连接的时候,这时候只有一个id。
第二个参数是select type,这里有simple,只要不包含子查询或者union都算是simple,当有union的时候,最左边查询显示select type是primary,右边则是union类型,union还有union result类型,当union去重的时候,会创建临时表用来去重,这时候就显示union result。以及还有相关子查询union和不相关子查询。还有from后面连接select的派生查询,derived。当吧子查询物化后,子查询在与外部链接,这时候就是物化查询。
Possible key是可能用到的索引,在计算成本的时候,会根据使用全部查询还是索引查询效率更高,当回表的成本太高,会使用全表查询,所以possible key不是越多越好,而key就是实际查询使用到的索引,key_len代表长度,可以根据当前表的字符集来计算出索引长度,比如varchar100,utf8 是字符集1~3,则是100*3。
Ref这列,当查询的type是上面 的const,ref,index其中之一的时候,显示的是const,当使用函数的时候,显示的usering condition。
Rows就代表查询了多少行才获取到数据,当all的时候代表要查询所有的行数。
Filtered过滤有两种情况,一种是单表查询,当有索引和非索引查询,这里如果显示10,则代表过滤完索引之后,百分之10的数据满足非索引条件查询。当union联合查询的时候,这种是表示驱动表的扇出值,被驱动表满足百分之10的数据,和rows组合可以计算出扇出值。
Extra顾名思义,记录额外数据的地方,比如sql里面没有写表,会显示no table,当有函数max,min的时候也会显示,当覆盖索引的时候,显示useing index。