Mysql Explain命令笔记

Mysql Explain命令笔记

用法

EXPLAIN <SQL语句>
EXPLAIN SELECT * FROM TBL_TEST WHERE ID=123;
使用explain命令可以查看某个SQL语句的执行过程,查看该SQL是否有用到索引,使用索引的方式,有没有作全表扫描,排序的时候有没有使用临时表等,对于SQL优化点的排查有很好的帮助。

输出

±-----±------------±---------±-----±--------------±--------------±--------±------------±-----±----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
±-----±------------±---------±-----±--------------±--------------±--------±------------±-----±----------------------+
| 1 | SIMPLE | TBL_TEST | ref | KEY_COL1_COL2 | KEY_COL1_COL2 | 206 | const,const | 1 | Using index condition |
±-----±------------±---------±-----±--------------±--------------±--------±------------±-----±----------------------+

  1. id为sql的执行顺序,由大到小,上到下的顺序执行
  2. select_type有以下几种类型:
    (1) SIMPLE
    简单SELECT(不使用UNION或子查询等) 例如:
    (2). PRIMARY
    最外层的select
    (3).UNION
    UNION中的第二个或后面的SELECT语句
    EXPLAIN SELECT * FROM TBL_TEST WHERE ID=123 UNION ALL SELECT * FROM TBL_TEST;
    ±-----±------------±---------±-----±--------------±-----±--------±-----±-----±------------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    ±-----±------------±---------±-----±--------------±-----±--------±-----±-----±------------+
    | 1 | PRIMARY | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
    | 2 | UNION | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | |
    ±-----±------------±---------±-----±--------------±-----±--------±-----±-----±------------+
    (4).DEPENDENT UNION
    UNION中的第二个或后面的SELECT语句,取决于外面的查询
    EXPLAIN SELECT * FROM TBL_TEST WHERE ID IN (SELECT ID FROM TBL_TEST UNION ALL SELECT ID FROM TBL_TEST);
    ±-----±-------------------±---------±-----±--------------±-----±--------±-----±-----±------------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    ±-----±-------------------±---------±-----±--------------±-----±--------±-----±-----±------------+
    | 1 | PRIMARY | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
    | 2 | DEPENDENT SUBQUERY | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
    | 3 | DEPENDENT UNION | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
    ±-----±-------------------±---------±-----±--------------±-----±--------±-----±-----±------------+
    (4).UNION RESULT
    UNION的结果。
    (5).SUBQUERY
    子查询中的第一个SELECT.
    (6). DEPENDENT SUBQUERY
    子查询中的第一个SELECT,取决于外面的查询
    (7).DERIVED
    派生表的SELECT(FROM子句的子查询)
  3. table字段,操作的表名
  4. type字段,这个字段很关键,用于阐述当前查询是属于哪种类型,是否使用索引、使用索引范围,连接类型为从好到差依次为:const>eq_ref>ref>range>index>ALL
    system: 表只有一行或者为空
    const: 使用唯一索引或者主键,返回记录一定是一条的等值where条件时,通常type是const
    eq_ref: 使用唯一索引或者主键,此类型通常出现于多表的join查询,表示对于前表的每一个结果,都对应后表的唯一一条结果。并且查询的比较是等值操作,查询效率比较高。
    ref可能找到多个符合条件的行,有三种情况:
    1. 非主键或者唯一键的等值查询
    2. join连接字段是非主键或者唯一键
    3. 最左前缀索引匹配
      range: 索引范围扫描,常用于><,is null,between,in,like等
      index:扫描全表索引,通常比All快一些
      ALL:全表扫描,没有使用索引
  5. possible_keys字段,显示select可能会使用的列
  6. key字段,此次查询所用到的索引key,没有则为NULL
  7. key_len字段,该查询计算使用的索引长度,在不损失精度情况下长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,并不是通过表内检索出的。
  8. ref字段,这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有: const(常量),字段名等。一般是查询条件或关联条件中等号右边的值,如果是常量那么ref列是const,非常量的话ref列就是字段名。
  9. row字段,表明此次查询过程中需要读取并检测的行数
  10. Extra字段,额外信息
    Using index——只扫面索引可以直接得到结果(结果集字段是索引)
    Using index condition——查询的列索引不完全覆盖(结果集的字段不全是索引)
    Using where——索引只用来执行定位,结果集需要查询对应数据行
    Using temporary——结果需要创建临时表处理,此类查询特别消耗资源
    Using filesort——排序使用外部排序,并不在内存中,此类排序效率很低消耗大量IO
上一篇:【mysql 5.7】Explain工具介绍-笔记


下一篇:mysql explain 中的key_len 的长度计算