mysql通过explain优化查询

   explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

mysql通过explain优化查询_第1张图片

一. explain语句中用于判断是否可优化的字段:

     1. select_type:

         1)simple:表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple,且只有一个。

         2)primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个。

         3)union:union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union。

         4)dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响。

         5)union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null。

         6)subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery。

         7)dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响。

         8)derived:from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select。

      2. type:

          1)system:系统表,少量数据,不需要磁盘IO。

          2)const:常量连接。

          3)eq_ref:主链索引或非空唯一索引等值扫描。

          4)ref:非主链,非唯一索引等值扫描。

          5)range:范围扫描。

          6)index:索引扫描。

          7)all:全表扫描。

      3. extra:

           1)using where:sql使用了where条件过滤数据。

           2)using index:sql需要返回的所有列数据均在一棵索引树上,而无需访问实际的行记录。

           3)using index condition:确实命中了索引,但不是所有列数据都在索引树上,还需要访问实际的行记录。

           4)using filesort:得到所需结果集,需要对所有记录进行文件排序。典型的,在一个没有建立索引的列上进行了order by,就会触发filesort。优化方案:在order by 的列上添加索引,避免每次查询都全是排序。

          5)using temporary:需要建立临时表来暂存中间结果。这类sql语句性能较低。典型的,group by和order by同时存在,且作用于不同的字段时,就会建立临时表,以便计算出最终结果集。

你可能感兴趣的