Mysql-Explain用法详解


使用方式:Explain + SQL语句

1.Explain能干嘛

在这里插入图片描述

2.Explain包含的表头信息

在这里插入图片描述

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

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

3.1 id相同

看一个demo:
在这里插入图片描述
这种情况下,根据Explain中的table信息从上而下执行

3.2 id不同

在这里插入图片描述

3.3 id相同又不同

在这里插入图片描述

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

这个字段的取值有以下几种:
在这里插入图片描述
这六种类型的解释如下:
在这里插入图片描述

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中最左原则和覆盖索引的讨论

8. Key_len

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

9. ref

显示和索引匹配的哪一列被使用了,展示的就是与索引列做等值匹配的条件,如常量或某个列
在这里插入图片描述

10. rows

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

11. Extra

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

类型说明
Using filesort说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,MySql中无法利用索引完成的排序操作称为”文件排序“
Using temporary用临时表保存中间结果,常用于GROUP BYORDER BY操作中,一般看到它说明查询需要优化了,就算避免不了临时表的使用也要尽量避免硬盘临时表的使用。
Not existsMYSQL优化了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 wherewhere子句的值总是false,不能用来获取任何元组
select tables optimized away在没有GROUP BY子句的情况下,基于索引优化MIN/MAX操作,或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
distinct优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作

附:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中的EXPLAIN命令用于查看SQL语句的执行计划,通过分析执行计划,我们可以了解该SQL语句是否使用了索引、是否进行了全表扫描等。EXPLAIN命令可以模拟优化器执行SQL查询语句的过程,从而帮助我们了解MySQL如何处理用户的SQL语句。 使用EXPLAIN命令时,我们可以得到一些字段的含义,这些字段包括: - id: 表示查询的顺序,如果有多个查询,则id的值会递增。 - select_type: 表示查询的类型,例如Simple表示简单查询,Subquery表示子查询。 - table: 表示查询的表名。 - type: 表示访问表的方式,常见的类型有ALL(全表扫描)和INDEX(使用索引)等。 - possible_keys: 表示可能使用的索引。 - key: 表示最终选择的索引。 - key_len: 表示索引字段的长度。 - ref: 表示与索引比较的参考值。 - rows: 表示查询结果的估计行数。 - Extra: 表示额外的信息,例如Using temporary表示需要使用临时表进行排序操作。 总之,EXPLAIN命令可以帮助我们了解MySQL处理SQL语句的过程,从而优化查询性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【MySQLexplain 用法详解](https://blog.csdn.net/Sunnyside_/article/details/115916038)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Mysql explain 详细用法](https://blog.csdn.net/lipei1220/article/details/107927071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值