mysql中explain使用说明

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: mysql中确定sql是否需要优化的方式很多,常见的就是看sql的执行时间,一般的sql执行的正常查询时间是在毫秒级,几十毫秒或是几百毫秒(数据在千万级别的除外,暂时没有处理过此处不做讨论),执行时间超过此时间段的就需要进行优化了。

 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 语句

示例查询部门信息的执行计划

0a11b68a3d4bb079175cd6fc58037f9f_9a9a94f87bf54218982e3725cf23b0d0.png

每个执行计划包含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操作符为=,且查询字段字段为唯一索引的单表查询,此时最多只会匹配到一行。

e122fd608e45917f6f30701c9fbc96a1_097bece520e04fa68d6309b04719c102.png

system:表中只有一条元组匹配(等于系统表),这是 const 类型的特例,平时不会出现,可以忽略不计。

   eq_ref:对于前一个表中的每一行组合,从该表中读取一行。除了system和const类型之外,这是最好的连接类型。出现场景:查询条件where操作符为‘=’,且查询字段字段为唯一索引的联表查询.示例(wy_client_user中id为主键索引,wy_client_user_summary通过user_id与wy_client_user进行关联):

fd35651da14350a56745227084f5c274_71dd326872d94f79ae36d0f3a2e8f3bc.png

   ref:对于前一个表中的每一行组合,将从此表中读取具有匹配索引值的所有行.出现场景:

where条件中有=,查询字段为非唯一索引的单表查询或是多表查询.示例(wy_client_user中mobile为普通索引,wy_client_user_summary通过mobile与wy_client_user进行关联):

2f8b708e1aba5ebac51d6ddc46163382_1dfea6cab3c34c629a66fbedd7c56706.png

592dcef8b2ac670387435bfe22b30526_14768de8282a49d3abea297b41281d19.png

   range:部分索引扫描。当where条件后面查询字段为索引且使用(<>、>、>=、<、<、<=、<=、<,<、<=)中的任何运算符或是将键列与常量进行比较,或是使用between and和in时连接类型都会是range。示例(wy_client_user中id为主键索引,login为唯一索引):

c51e60f3be98d2bf02938b6380ffe2cf_0e45a2ba72f249aca70cc2cbf1c79766.png

328b0ca53d0bffa444dc30d23ecfa539_ddaae51abc2b49da98c4131b1b95c986.png

6cf1d37b4d841b42ca33fd8933544667_f076093847534987b21b7007e16bea0d.png

   index:全表索引扫描,执行效率比all要高一些,因为索引数量要比数据库中所有数据记录要少一些.一般出现的情况是查询字段为索引字段,没有where条件语句,示例:

0ccd0551ef33f07982554ee89dad69e1_b0486da1de08489a9b9b9c43b4250edd.png

   all:全表查询,执行效率最低,应当避免.

   type常见类型总结汇总:

abdebe6df7dc8c1dd635010e97fc1493_f5386869be3c40dcac3384c4c6abefc8.png


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:建立了临时表来保存中间结果,查询完成之后又要把临时表删除。会很影响性能,需尽快优化。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
SQL 存储 关系型数据库
SQL优化之Explain详解(mysql)
`Explain`是MySQL中用于分析SQL查询执行计划的工具。它可以帮助我们了解MySQL如何执行SQL语句,包括如何使用索引、预计的行数以及查询的顺序。以下是`Explain`输出的关键列及其含义的简要摘要: 1. **id**:查询的序列号,表示查询中的子句层次,id越大优先级越高。 2. **select_type**:表示查询的类型,如SIMPLE(简单查询)、PRIMARY(主查询,多表查询中的第一个查询)、SUBQUERY(子查询)、DERIVED(派生表)或UNION(UNION操作的查询部分)。 3. **table**:查询涉及的表名,如果是子查询,可能显示为衍生表
97 0
|
11天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
98 9
|
2月前
|
SQL 关系型数据库 MySQL
MySQL EXPLAIN该如何分析?
本文将详细介绍MySQL中`EXPLAIN`关键字的工作原理及结果字段解析,帮助优化查询性能。`EXPLAIN`可显示查询SQL的执行计划,其结果包括`id`、`select_type`、`table`等字段。通过具体示例和优化建议,帮助你理解和应用`EXPLAIN`,提升数据库查询效率。
137 0
|
7月前
|
关系型数据库 MySQL 数据库
MySql GROUP_CONCAT使用说明
MySql GROUP_CONCAT使用说明
|
5月前
|
SQL 关系型数据库 MySQL
mysql性能调优:EXPLAIN命令21
【7月更文挑战第21天】掌握SQL性能调优:深入解析EXPLAIN命令的神奇用法!
65 1
|
5月前
|
SQL 缓存 关系型数据库
MySQL|浅谈explain的使用
【7月更文挑战第11天】
|
5月前
|
SQL 存储 数据库
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
|
5月前
|
SQL 索引 关系型数据库
MySQL设计规约问题之为什么推荐使用EXPLAIN来检查SQL查询
MySQL设计规约问题之为什么推荐使用EXPLAIN来检查SQL查询
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
82 2