MySql之查看执行计划

概述:

执行计划的查看是进行数据库的sql语句调优时依据的一个重要依据,mysql的执行计划查看相对oracle简便很多,功能也相对简单很多的SQL语句都不能直接查看。

执行计划的生成

生成的方法很简单在相应的select前面加explain即可

执行计划的查看

  • ID:
    包含一组数字,表示查询中执行select子句或操作表的顺序;
    说明:一般比较简单的查询语句里只有一个select,稍微复杂点的查询如包含子查询或者包含union语句的情况会有多个select,有几个select就有几个id,并且id的顺序是按select出现的顺序增长的;
  • id相同,执行顺序从上之下
  • id不同,执行顺序从大到小
  • id相同不同,同时存在,遵守1、2规则
EXPLAIN SELECT* FROM user_test.`order` WHERE	id IN (SELECT id FROM user_test.`user`)

按照我们的正常预期,子查询select id from user_test.user肯定是先执行,然后才执行外面的针对order表的查询,那么我们查看执行计划的结果
两个语句的id都是1,但是按照从上往下执行的规则,先执行针对user表的查询,再执行针对order表的查询,符合我们的预期
在这里插入图片描述

  • Select_type
    表示查询中每个select子句的类型(简单OR复杂),
    有以下几种:
    • SIMPLE:查询中不包含子查询或者UNION
    • PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY
    • SUBQUERY:在SELECT或WHERE列表中包含了子查询,该子查询被标记为SUBQUERY
    • DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生)
  • table
    表示这一行是根据哪张表来的
  • Type
    • 表示MySQL在表中找到所需行的方式,又称“访问类型”,常见有以下几种:

      • ALL:Full Table Scan, MySQL将进行全表扫描;
      • Index:Full Index Scan,index与ALL区别为index类型只遍历索引树;
      • range:range Index Scan,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询;
      • ref: 表示非唯一性索引
      • eq_ref: 表示唯一索引
      • const: 一次就找到数据的唯一索引
    • all < index < range < ref < eq_ref < const < system

    • 可以使用到索引,除了 index_merge 之外,其他的 type 只可以用到一个索引。一般来说,得保证查询至少达到 range 级别,最好能达到 ref

  • possible_keys : 可能用到的索引
  • key : 实际使用到的索引
  • key_len: 使用到的索引长度,根据索引组合字段类型所占的字节数来计算。MySQL在执行计划中输出key_len列主要是为了让我们区分某个使用联合索引的查询具体用了几个索引列。
  • ref 显示哪一列索引有被用到,
  • row 大致估算找到目标记录所需要读取的行数; 这个越低越好;
  • fitered 显示通过条件过滤出的行数的百分比估计值;
  • extra mysql解析查询过程中的额外信息
    • distinct 找到第一个匹配的元组后立即停止找相同值得操作
    • using filesort 可能出现了排序操作和使用索引导致结果排序
    • using temporary 用到了临时表保存中间结果,常用与groupby 操作,一般看到他说明需要优化了
    • using index 使用到了索引覆盖
    • using index condition 发生索引下推
    • using where 会根据查询条件过滤出结果集
    • using join buffer
    • looseScan
    • FirstMatch

你可能感兴趣的:(MySql,mysql,数据库)