mysql explain

电脑系统 win 10
数据库版本 mysql 8.0    官方文档
navicat  11.1.13

参考:

  • 官方--8.8.2 EXPLAIN输出格式
  • explain之二:Explain 结果解读与实践,分析诊断工具之二
  • MySQL优化—工欲善其事,必先利其器之EXPLAIN

 

执行计划:

 方法

两种方法都行:下面例子使用第一种;

 1、在sql 语句前添加 EXPLAIN

EXPLAIN select  * from user
mysql explain_第1张图片 图一

2、输入sql  然后点击 工具栏中的' 解释'

mysql explain_第2张图片 图二
​​​​

结果列说明 :

   id : select 查询序号,id越大的语句越先执行;

   select_type:    select查询类型;

  • SIMPLE : 常见的类型(不使用UNION或子查询);
  • PRIMARY:在嵌套的查询中是最外层的SELECT语句,在UNION查询中是最前面的SELECT语句。
  • UNION: UNION中第二个以及后面的SELECT语句。
  • UNION RESULT: UNION 的结果。
  • DEPENDENT UNION:满足UNION的条件,及UNION中第二个以及后面的SELECT语句,同时该语句依赖外部的查询。
  • SUBQUERY:子查询中第一个SELECT语句。
  • DEPENDENT SUBQUERY:在子查询中,依赖于外部查询。
  • DERIVED: 派生表SELECT语句中FROM子句中的SELECT语句。

table : 输出的行所引用的表,可能是别名。

partitions:记录将与查询匹配的分区。

type:连接类型。

  •      system:这是const连接类型的一种特例,表仅有一行满足条件。
  •      const : 只有一行,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。const只会用在将常量和主键或唯一索引进行比较时,而且是比较所有的索引字段。(图一
  •     range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。key_len包含所使用索引的最长关键元素。在该类型中ref列为NULL。当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range:
EXPLAIN SELECT * from user where id =1 or id =2

mysql explain_第3张图片 

  •    all: 最慢的一种方式,即全表扫描(图二)。

possible_keys:MySQL可以选择在此表中查找行的索引。

key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

key_len:显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好 

ref: 该ref列显示哪些列或常量与列中指定的索引进行比较,以 key从表中选择行。

rows rows列指示MySQL认为必须检查以执行查询的行数,对于InnoDB表格,此数字是估算值。

filteredfiltered列指示将按表条件过滤的表行的估计百分比。最大值为100,这意味着不会对行进行过滤。值从100开始减少表示过滤量增加。 rows显示检查的估计行数,rows×filtered表示将与下表连接的行数。例如,如果 rows是1000并且 filtered是50.00(50%),则使用下表连接的行数是1000×50%= 500。

extra:输出包含MySQL解决查询的额外信息.

  • Using index :说明查询是覆盖了索引的,这是好事情。MySQL直接从索引中过滤不需要的记录并返回命中的结果。这是MySQL服务层完成的,但无需再回表查询记录。
  • Using Filesort:一般出现在 使用了 order by 语句当中,并不是说通过磁盘文件进行排序.  (age  是索引)

请注意这个不走索引 解决方法在下面:

EXPLAIN SELECT * FROM   user  ORDER BY age desc

    

 方法一、select 只查询索引字段,order by 索引字段会用到索引,要不然就是全表排列;

方法二、加上where 条件,where 索引字段

 

  • Using index condition 这是MySQL 5.6出来的新特性,叫做“索引条件推送”。简单说一点就是MySQL原来在索引上是不能执行如like这样的操作的,但是现在可以了,这样减少了不必要的IO操作,但是只能用在二级索引上,详情点这里。
  • Using where:使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。

    注意:Extra列出现Using where表示MySQL服务器将存储引擎返回服务层以后再应用WHERE条件过滤。

  • Backward index scan(反向扫描): 8.0 版本的新特性。大牛的文章

 

你可能感兴趣的:(mysql)