Mysql-Explain用法详解

文章目录

    • 1.Explain能干嘛
    • 2.Explain包含的表头信息
    • 3.Explain-id(表的读取顺序)
      • 3.1 id相同
      • 3.2 id不同
      • 3.3 id相同又不同
    • 4. Explain-Select_type(数据读取操作的操作类型)
    • 5. Table
    • 6. Type
    • 7. possible_keys和key
    • 8. Key_len
    • 9. ref
    • 10. rows
    • 11. Extra

使用方式:Explain + SQL语句

1.Explain能干嘛

Mysql-Explain用法详解_第1张图片

2.Explain包含的表头信息

在这里插入图片描述

3.Explain-id(表的读取顺序)

这里的id不是主键,它是一组数字12345这种,表示我们进行表查询的先后顺序,其中id可以有三种情况:id相同,id不同,id同时相同和不同

3.1 id相同

看一个demo:
Mysql-Explain用法详解_第2张图片
这种情况下,根据Explain中的table信息从上而下执行

3.2 id不同

Mysql-Explain用法详解_第3张图片

3.3 id相同又不同

Mysql-Explain用法详解_第4张图片

4. Explain-Select_type(数据读取操作的操作类型)

这个字段的取值有以下几种:
Mysql-Explain用法详解_第5张图片
这六种类型的解释如下:
Mysql-Explain用法详解_第6张图片

5. Table

这个就不用多解释了,就是在explain显示后的数据中表示这一行的数据来自哪张表

6. Type

字面意思是访问类型,它有8种值:
在这里插入图片描述
这8种类型从好到差的顺序是:system>const>eq_ref>ref>range>index>ALL,下面来解释:

  • system:只有一行记录,相当于系统表,可以忽略不记
  • const:常量,表示通过索引一次就找到了,常用于匹配主键或者unique索引,值匹配一行数据
  • eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配
  • ref:非唯一性索引扫描,返回匹配到的某个值的所有行
  • range:只检索给定范围的行,一般情况下是where语句后加了between,>,<,in等条件
  • index和ALL:index遍历全部索引,ALL读全表,index比ALL块因为index从索引读取,ALL从硬盘读取

7. possible_keys和key

possible_keys:显示可能应用在这张表种的索引,一个或多个,但不一定被使用
Key:实际使用的索引,如果为NULL,则没有使用索引,若使用了覆盖索引,则该索引仅出现在Key列表种
覆盖索引
Mysql-Explain用法详解_第7张图片

关于覆盖索引更详细的讨论请看:MySQL中最左原则和覆盖索引的讨论

8. Key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精度的情况下,长度越短越好

9. ref

显示和索引匹配的哪一列被使用了,展示的就是与索引列做等值匹配的条件,如常量或某个列
Mysql-Explain用法详解_第8张图片

10. rows

rows列显示MySQL认为它执行查询时必须检查的行数。注意这是一个预估值,越少越好

11. Extra

Extra是EXPLAIN输出中另外一个很重要的列,该列显示MySQL在查询过程中的一些详细信息,MySQL查询优化器执行查询的过程中对查询计划的重要补充信息。

类型 说明
Using filesort 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,MySql中无法利用索引完成的排序操作称为”文件排序“
Using temporary 用临时表保存中间结果,常用于GROUP BYORDER BY操作中,一般看到它说明查询需要优化了,就算避免不了临时表的使用也要尽量避免硬盘临时表的使用。
Not exists MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就不再搜索了。
Using index 说明查询是覆盖了索引的,不需要读取数据文件,从索引树(索引文件)中即可获得信息。如果同时出现using where,表明索引被用来执行索引键值的查找,没有using where,表明索引用来读取数据而非执行查找动作。这是MySQL服务层完成的,但无需再回表查询记录。
Using index condition 这是MySQL 5.6出来的新特性,叫做“索引条件推送”。简单说一点就是MySQL原来在索引上是不能执行如like这样的操作的,但是现在可以了,这样减少了不必要的IO操作,但是只能用在二级索引上。
Using where 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。注意:Extra列出现Using where表示MySQL服务器将存储引擎返回服务层以后再应用WHERE条件过滤。
Using join buffer 使用了连接缓存:Block Nested Loop,连接算法是块嵌套循环连接;Batched Key Access,连接算法是批量索引连接
impossible where where子句的值总是false,不能用来获取任何元组
select tables optimized away 在没有GROUP BY子句的情况下,基于索引优化MIN/MAX操作,或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
distinct 优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作

附:
Mysql-Explain用法详解_第9张图片

你可能感兴趣的:(数据库)