mysql-执行计划

  1. 执行计划可以帮助我们看到sql查询的具体过程,我们可以根据此过程评估该sql的执行效率。
  2. 语法
    EXPLAIN 
    
  3. 字段分析
    1. id

      1. select查询的序列号,标识执行的顺序
        • ID相同,执行顺序由上至下
        • id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
    2. select_type

      1. SIMPLE
        1. 简单的select查询,查询中不包含子查询或者union
           `案例`
              EXPLAIN SELECT * FROM emp WHERE deptno = 30 
          
      2. PRIMARY
        1. 查询中包含子部分,最外层查询则被标记为primary
         `案例`
            EXPLAIN SELECT * FROM emp  
            WHERE deptno = 
            (SELECT deptno FROM dept  WHERE dname='SALES') ;
        
         描述
            EXPLAIN SELECT * FROM emp   WHERE deptno = () ;   select_type 为 primary
        
      3. SUBQUERY/MATERIALIZED
        1. SUBQUERY
          1. 表示select 或 where 列表 中包含了子查询
          案例
              EXPLAIN SELECT * FROM emp  
              WHERE deptno = (SELECT deptno FROM dept WHERE dname='SALES') ;
          描述 
              (SELECT deptno FROM dept  WHERE dname='SALES')内是一个子查询 ,而此查询
               select_type = SUBQUERY
          注意
               where条件中使用 in 不是子查询 而是普通查询
          
        2. MATERIALIZED(where 后面 in 条件的子查询)
      4. UNION(union 中第二个或后面的select 语句)
      5. UNION RESULT
    3. table( 查询涉及到的表)

      • 直接显示表名或者表的别名
      • 由 ID 为 M,N 查询 union 产生的结果
      • 由ID为N 查询产生的结果
    4. type

      1. 访问类型,SQL查询优化中一个很重要的指标,结果值从好到坏依次是 system > const > eq_ref > ref > range > index > All
        1. system
          1. 系统表,少量数据,往往不需要进行磁盘IO

          1. 特点:
            从系统库MYSQL的系统里查询数据,访问类型为 system ,这些数据已经加载到内存中
            不需要磁盘IO,这类扫描速度是最快的
        2. const(常量连接)

          1. 特点
            命中主键(primary key) 或者唯一 (unique)索引被连接的部分是一个常量(const)值
          2. 列子
            命中主键
            命中唯一
        3. eq_ref

          1. 主键索引(primary key )或者 非空唯一索引(unique not null)等值扫描
          2. 特点
            join 查询
          3. 列子
            命中主键 (primary key)索引 一对一等值连接
            非空唯一 (unique not null)索引 一对一等值连接
        4. ref

          1. 非主键非唯一索引等值扫描
          2. 特点
            一对多等值连接,由eq_req 降级为 ref
        5. range(范围扫描)

          1. 特点
            索引上的范围查询,他会在索引上扫码特定范围内的值
            between 、in 、>、<、>=、<=都是典型的范围(range)查询
          2. 例子
            命中主键
        6. index(索引树扫描)

          1. 特点
            需要通过扫描 索引上的全部数据 来获取结果,他仅比全表扫描快一点
          2. 例子
            全表查询
        7. ALL全表扫描(full table scan )

          1. 特点
            需要通过扫描非索引上的全部数据来获取结果
          2. 例子
            全表直接查询
            查询不是索引的字段
    5. possible_keys

      1. 查询过程中有可能使用到的索引
    6. key

      1. 实际使用的索引,如果为 null ,则没有使用索引
    7. row

      1. 根据表统计信息或者索引选用情况,大致估算处找到所需记录所需要读取的行数, 越小越好
    8. filtered

      1. 表示返回结果的行数 占读取行数的百分比, filtered 的值越大越好
    9. extra

      1. Using filesort
        MYSQL 对数据使用一个外部的文件内容进行了排序,而不是按照表内的索引进行排序读取
      2. Using temporary
        使用临时表保存中间结果,也就是说 mysql在对查询结果排序时使用了临时表,常见于 order by 或者 group by
      3. Using index
        表示 SQL操作中使用了覆盖索引(Covering index), 避免了访问表的数据行,效率高
      4. Using index condition
        表示SQL 操作命中了索引,但不是所有的列数据都在索引树上,还需要访问实际的行记录。
      5. Using where
        表示SQL操作使用了 where过滤条件
      6. select tables optimized away
        基于索引优化 MIN/MAX操作 或者MyISAM存储引擎优化count(*)操作,不必等到执行阶段在井陉计算,查询执行计划生成的阶段即可完成优化
      7. Using join buffer(Block Nested Loop)
        表示SQL操作使用了关联查询或者 子查询,且需要进行嵌套循环计算

你可能感兴趣的:(mysql-执行计划)