查询计划参考

一、官方:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

二、语句:

explain select * from tableName;

 

  • id:执行的顺序,数值大的优先执行
  • select_type:查询类型,方式
    select_type 值JSON名称含义
    SIMPLE 没有 简单SELECT(不使用 UNION或子查询)
    PRIMARY 没有 最外层 SELECT
    UNION 没有 第二个或之后的SELECT陈述 UNION
    DEPENDENT UNION dependenttrue 中的第二个或更高版本的SELECT语句 UNION,取决于外部查询
    UNION RESULT union_result 的结果UNION
    SUBQUERY 没有 首先SELECT在子查询
    DEPENDENT SUBQUERY dependenttrue 首先SELECT在子查询中,取决于外部查询
    DERIVED 没有 派生表
    DEPENDENT DERIVED dependenttrue 派生表依赖于另一个表
    MATERIALIZED materialized_from_subquery 物化子查询
    UNCACHEABLE SUBQUERY cacheablefalse 子查询,其结果无法缓存,必须针对外部查询的每一行重新进行评估
    UNCACHEABLE UNION cacheablefalse UNION 属于不可缓存子查询的中的第二个或更高版本的选择(请参阅参考资料 UNCACHEABLE SUBQUERY
  • table:表名
  • partitions:查询将从中匹配记录的分区。该值适用NULL于未分区的表
  • type(注意我下面写的描述是根据我实际测试的结果写的,不是完全参照官网):参考https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain-join-types
    • system:该表只有一行(=系统表),const的一个特例,
    • const:唯一键的=条件基本上都是这个
    • eq_ref:关联子查询中有一个执行计划命中eq_ref
    • ref:命中的是一个普通索引(非唯一键)
    • fulltext:参考https://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html,先建立一个全文索引,再利用相应的函数进行查询
    • ref_or_null:与ref不同的是增加一个or条件is null
    • index_merge:这个比较容易,就是一个where or的条件语句,前后都是命中索引的
    • unique_subquery:搞了半天也是没搞出来,官方语句:value IN (SELECT primary_key FROM single_table WHERE some_expr)
    • index_subquery:类似于unique_subquery,适用于子查询中的非唯一键插叙,弄了好几种尝试,愣是没搞出来,先贴个官方的:value IN (SELECT key_column FROM single_table WHERE some_expr)
    • range:范围查询,
      • =    等于
      • <>      不等于
      • >        大于
      • >=      大于等于
      • <    小于
      • <=      小于等于
      • IS NULL 是否为空
      • <=>  <=> NULL 相当于 IS NULL
      • BETWEEN  介于起止两个点之间,包含
      • LIKE  不加通配符的情况下,也相当于=
      • IN   在指定集合的范围内 
    • index
      • Extra:use Index:查询索引字段,这种情况下只扫描索引树,理论上更快
      • Extra:空;例子:order by 索引字段,查询涵没有索引的字段,只是根据索引树顺序来查询数据,实际上还要从表中读取数据,所以速度理论上应该比上面那种慢
    • all:最慢,全表
  • possible_keys:可能用到的索引
  • key:实际用到的索引
  • key_len:key长度,字节
  • ref:ref列显示将哪些列或常量与该key列中命名的索引进行比较,以 从表中选择行(一般显示const或者外键关联的字段)
  • row:预估的记录数量
  • filtered:filtered列指示将被表条件过滤的表行的估计百分比。最大值为100,表示没有行过滤发生。值从100减小表示过滤量增加。 rows显示检查的估计行数,rows× filtered显示将与下表连接的行数。例如,如果 rows为1000且 filtered为50.00(50%),则与下表连接的行数为1000×50%= 500。
  • Extra:参考https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain-extra-information (太多了,实在不想写,具体意义一般是参照其他列看,常见的应该是Use Where、Using index)
posted @ 2020-09-21 17:53  gabin  阅读(196)  评论(0编辑  收藏  举报