MySql--Explain 详解(上)

具体细节 请去掘金购买《MySQL 是怎样运行的:从根儿上理解 MySQL》

EXPLAIN

EXPLAIN语句输出形式

  • 1.id:在一个大的查询语句中每个SELECT关键字都对应一个唯一的id
  • 2.select_type: SELECT关键字对应的那个查询的类型
  • 3.table:表名
  • 4.partitions:匹配的分区信息
  • 5.type:针对单表的访问方法
  • 6.possible_keys:可能用到的索引
  • 7.key: 实际上使用的索引
  • 8.key_len:实际使用到的索引长度
  • 9.ref:当使用索引列等值查询时,与索引列进行等值匹配的对象信息
  • 10.rows:预估的需要读取的记录条数
  • 11.filtered:某个表经过搜索条件过滤后剩余记录条数的百分比
  • 12.Extra:一些额外的信息

table

  • 1.EXPLAIN语句输出的每条记录都对应着某个单表的访问方法,该条记录的table列代表着该表的表名

id

  • 1.对于包含UNION的语句,每一个select 就对应一个id
  • 2.在连接查询的执行计划中,每个表都会对应一条记录,这些记录的id列的值是相同的,出现在前边的表表示驱动表,出现在后边的表表示被驱动表
  • 3.一般包含子查询的id是不一样的
  • 4.查询优化器可能对涉及子查询的查询语句进行重写,从而转换为连接查询。这时候id就一样了。
  • 5.UNION会生成一个临时表,对结果进行去重。这个时候id为NULL

select_type

  • 1.每一个SELECT关键字代表的小查询都定义了一个称之为select_type的属性
  • 2.SIMPLE:查询语句中不包含UNION或者子查询的查询都算作是SIMPLE类型
  • 3.PRIMARY:对于包含UNION、UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的select_type值就是PRIMARY
  • 4.UNION:对于包含UNION或者UNION ALL的大查询来说,它是由几个小查询组成的,其中除了最左边的那个小查询以外,其余的小查询的select_type值就是UNION
  • 5.UNION RESULT:MySQL选择使用临时表来完成UNION查询的去重工作,针对该临时表的查询的select_type就是UNION RESULT
  • 6.SUBQUERY:如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是不相关子查询,并且查询优化器决定采用将该子查询物化的方案来执行该子查询
  • 7.DEPENDENT SUBQUERY: 如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是相关子查询,则该子查询的第一个SELECT关键字代表的那个查询的select_type就是DEPENDENT SUBQUERY
  • 8.DEPENDENT UNION:在包含UNION或者UNION ALL的大查询中,如果各个小查询都依赖于外层查询的话,那除了最左边的那个小查询之外,其余的小查询的select_type的值就是DEPENDENT UNION
  • 9.DERIVED:采用物化的方式执行的包含派生表的查询
  • 10.MATERIALIZED:当查询优化器在执行包含子查询的语句时,选择将子查询物化之后与外层查询进行连接查询
  • 11.UNCACHEABLE SUBQUERY
  • 12.UNCACHEABLE UNION
  • 13.select_type为DEPENDENT SUBQUERY的查询可能会被执行多次

type

  • 1.代表访问一条记录的方法是什么样的
  • 2.具体的访问方法以前写过 可以参考:https://www.jianshu.com/p/2afee5496e61

possible_keys和key

  • 1.前者列出查询时候可能用到的索引
  • 2.后者代表实际的索引
  • 3.使用index访问方法来查询某个表时,possible_keys列是空的,而key列展示的是实际使用到的索引
  • 4.possible_keys列中的值并不是越多越好,可能使用的索引越多,查询优化器计算查询成本时就得花费更长时间,所以如果可以的话,尽量删除那些用不到的索引
  • 5.key_len:索引的长度

ref

  • 1.索引列等值匹配的条件去执行查询时,也就是在访问方法是const、eq_ref、ref、ref_or_null、unique_subquery
    、index_subquery其中之一时,ref列展示的就是与索引列作等值匹配的东西(常数或者列或者函数)

rows

  • 1.代表预计需要扫描的行数或者索引记录行数
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容