mysql中explain使用说明

    mysql中确定sql是否需要优化的方式很多,常见的就是看sql的执行时间,一般的sql执行的正常查询时间是在毫秒级,几十毫秒或是几百毫秒(数据在千万级别的除外,暂时没有处理过此处不做讨论),执行时间超过此时间段的就需要进行优化了。另一种最常见的就是看mysql的执行计划。这也是本文的重点说明的内容,将具体讲述执行计划中每个字段的含义。
explain执行计划说明:
    EXPLAIN语句提供有关MySQL如何执行语句的信息。EXPLAIN适用于SELECT、DELETE、INSERT、REPLACE和UPDATE语句。
    EXPLAIN为SELECT语句中使用的每个表返回一行信息。它按照MySQL在处理语句时读取表的顺序列出输出中的表。MySQL使用嵌套循环连接方法解析所有连接。这意味着MySQL从第一个表中读取一行,然后在第二个表、第三个表中找到匹配行,依此类推。处理完所有表后,MySQL输出所选列并回溯表列表,直到找到一个匹配行更多的表。从该表中读取下一行,并继续处理下一个表。
    首先看一下执行计划的的执行命令(本文mysql环境为5.7)。

explain select 语句

    示例查询部门信息的执行计划
在这里插入图片描述
    每个执行计划包含10个列信息。分别说明一下列信息
1.id
2.select_type
3.table
4.type
5.possible_keys
6.key
7.key_len
8.ref
9.rows
10.extra

1.id

    id表示执行sql的顺序,一般id值越大的执行的优先级越高;相同id,执行优先级是从上往下;对于id为null的情况一般是表示的是结果集,不用做查询.

2.select_type

    select_type表示查询类型,常见的有以下几种:
    simple:最简单的查询,只有select from 表,无其他查询。
    primary :最简单查询包含子查询,最外层的为primary查询。比如说:select * from (select * from t2) t1,其中最外层的是primary.
    derived:在from 后面的子查询,比如说:select * from (select * from t2) t1.其中t2表derived.
    subquery:在select 或是where后面的查询为子查询,比如说:
select * from t1 where t1.id=(select * from t2).其中select * from t2为subquery.
    dependent_subquery:在select 或是where后面的子查询,并且子查询返回多个值的情况.比如说:
select * from t1 where t1.id in (select * from t2).其中select * from t2为dependent_subquery.
    union: 第二个select在union 之后,比如说:

select * from t1
union all
select * from t2

其中t2为union查询.
    union result:union all联查的类型为union result。比如说:

select * from t1
union all
select * from t2

其中所有的查询为union result。

3.table

    table表示当前查询的表名称

4.type

    type:表示查询语句中表的连接方式,常见的支持类型为(按照执行性能从高到低排列):
    constant:单表查询最多有一个匹配行.出现场景:出现于where操作符为=,且查询字段字段为唯一索引的单表查询,此时最多只会匹配到一行。
在这里插入图片描述
system:表中只有一条元组匹配(等于系统表),这是 const 类型的特例,平时不会出现,可以忽略不计。
    eq_ref:对于前一个表中的每一行组合,从该表中读取一行。除了system和const类型之外,这是最好的连接类型。出现场景:查询条件where操作符为‘=’,且查询字段字段为唯一索引的联表查询.示例(wy_client_user中id为主键索引,wy_client_user_summary通过user_id与wy_client_user进行关联):

在这里插入图片描述

    ref:对于前一个表中的每一行组合,将从此表中读取具有匹配索引值的所有行.出现场景:
where条件中有=,查询字段为非唯一索引的单表查询或是多表查询.示例(wy_client_user中mobile为普通索引,wy_client_user_summary通过mobile与wy_client_user进行关联):

在这里插入图片描述
在这里插入图片描述
    range:部分索引扫描。当where条件后面查询字段为索引且使用(<>、>、>=、<、<、<=、<=、<,<、<=)中的任何运算符或是将键列与常量进行比较,或是使用between and和in时连接类型都会是range。示例(wy_client_user中id为主键索引,login为唯一索引):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
    index:全表索引扫描,执行效率比all要高一些,因为索引数量要比数据库中所有数据记录要少一些.一般出现的情况是查询字段为索引字段,没有where条件语句,示例:
在这里插入图片描述

    all:全表查询,执行效率最低,应当避免.
    type常见类型总结汇总:
在这里插入图片描述

5.possible_keys

    possible_keys表示每个查询语句中可能用到的索引.

6.key

    key表示查询语句中实际用到的索引名称.

7.key_len

    key_len表示查询语句中实际用到的索引名称的长度.

8.ref

    ref表示哪个字段或者常量与key一起被使用.如果是使用的常量等值查询,这里会显示const;如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段;如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func。

9.rows

    rows表示每个查询语句中查询的行数.大致估算此处查询需要读取的行数,不是精确值。

10.extra

     extra表示额外信息.常见的有以下几种:
     using index: sql语句没有where查询条件,使用覆盖索引,不需要回表查询即可拿到结果.
     using where: 没有使用索引/使用了索引但需要回表查询且没有使用到下推索引.
     using index && useing where: sql语句有where查询条件,且使用覆盖索引,不需要回表查询即可拿到结果。
     Using index condition:使用索引查询,sql语句的where子句查询条件字段均为同一索引字段,且开启索引下推功能,需要回表查询即可拿到结果。
     Using index condition && using where:使用索引查询,sql语句的where子句查询条件字段存在非同一索引字段,且开启索引下推功能,需要回表查询即可拿到结果。
     using filesort: 当语句中存在order by时,且orderby字段不是索引,这个时候mysql无法利用索引进行排序,只能用排序算法重新进行排序,会额外消耗资源。
     Using temporary:建立了临时表来保存中间结果,查询完成之后又要把临时表删除。会很影响性能,需尽快优化。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而得知MySQL如何处理该查询语句。通过执行EXPLAIN语句,可以获取查询的执行计划信息,包括索引的使用情况、连接表的方式等,帮助选择更好的索引和编写更优化的查询语句。可以在SELECT语句之前增加EXPLAIN关键字,MySQL会返回执行计划的信息,而不是实际执行该SQL语句。另外,EXPLAIN关键字还有一个变种叫做EXPLAIN EXTENDED,用于提供更详细的执行计划信息。如果你想查看更多关于EXPLAIN的详细信息,你可以参考MySQL官方文档关于EXPLAIN说明。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [MySQL - Explain详解](https://blog.csdn.net/weixin_42201180/article/details/126122714)[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^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [MySQL数据库:第十七章:Explain详解](https://blog.csdn.net/java_wxid/article/details/111881486)[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^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卖柴火的小伙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值