Explain工具详解

作者: imule 分类: MYSQL 发布时间: 2022-11-04 16:13

Explain介绍

在select语句之前增加explain关键字,执行查询会返回执行计划信息,而不是执行这条SQL;我们可以根据

返回的执行计划分析查询语句的性能瓶颈,总而言之explain可以模拟优化器执行SQL语句。

Explain中的列

  1. id列
    • id列是select的序列号,id列越大执行优先级越高,相同则从上往下,为Null则最后执行;
  2. select_type列
    • simple:简单查询(不包含子查询和union);
    • primary:复杂查询中最外层的 select;
    • subquery:包含在 select 中的子查询(不在 from 子句中);
    • derived:包含在 from 子句中的子查询(派生表);
    • union:在 union 语句中的除第一个select外的其他select;
  3. table列
    • 这一列表示explain结果表中的这行正在访问哪个表;
  4. type列
    • 这一列表示关联类型或访问类型,依次从最优到最差分别为:system>const>eq_ref>ref>range>index>ALL;
      • system,const:用于primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快,system是const的特例,表里只有一条元素匹配时为system;
      • eq_ref:primary key 或 unique key 索引的所有部分被连接使用,最多只会返回一条符合条件的记录;
      • ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀;
      • range:范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行;
      • index:扫描全表索引,这通常比ALL快一些;
      • ALL:即全表扫描;
  5. possible_keys列
    • 这一列显示查询可能使用哪些索引来查找;
  6. ​​​​​​​key列
    • 这一列显示mysql实际采用哪个索引来优化对该表的访问;
  7. ​​​​​​​key_len列
    • 这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列;
  8. ref列
    • 这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名;
  9. ​​​​​​​rows列
    • 这一列是mysql估计要读取并检测的行数;
  10. ​​​​​​​Extra列
    • 这一列展示的是额外信息,常见值有;
      • Using index:使用覆盖索引
      • Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围;
      • Using where:使用where语句来处理结果,查询的列未被索引覆盖;
      • Using temporary:mysql需要创建一张临时表来处理查询;
      • Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序;
寄语

    有人在奔跑,有人在睡觉,有人在感恩,有人在抱怨,有目标的睡不着,没目标的睡不醒,努力才是人生应有的态度,睁开眼就是新的开始。

本站文章主要用于个人学习记录,可能对您有所帮助,仅供参考!

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!