explain执行结果分析详解

        执行计划是指一条SQL语句经过MySQL查询优化器的优化后,具体的执行方式。

        通过查看explain的结果,可以了解到数据表的查询顺序、数据查询操作的操作类型、哪些索引可以被命中、哪些索引实际会命中、每个数据表有多少行被查询等信息。

  explain执行计划支持selectupdateinsertreplace以及update语句,一般多用于分析select查询语句,语法如下:

EXPLAIN + SELECT 查询语句;

查询语句的执行计划示例:

mysql> explain SELECT * FROM dept_emp WHERE emp_no IN (SELECT emp_no FROM dept_emp GROUP BY emp_no HAVING COUNT(emp_no)>1);
+----+-------------+----------+------------+-------+-----------------+---------+---------+------+--------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys   | key     | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+----------+------------+-------+-----------------+---------+---------+------+--------+----------+-------------+
|  1 | PRIMARY     | dept_emp | NULL       | ALL   | NULL            | NULL    | NULL    | NULL | 331143 |   100.00 | Using where |
|  2 | SUBQUERY    | dept_emp | NULL       | index | PRIMARY,dept_no | PRIMARY | 16      | NULL | 331143 |   100.00 | Using index |
+----+-------------+----------+------------+-------+-----------------+---------+---------+------+--------+----------+-------------+

执行计划结构中共有12列,各列代表的含义总结如下标:

列名

含义

id

select_type

table

partitions

type

possible_keys

key

key_len

ref

rows

filtered

Extra

SELECT查询的序列标识符(值越大,优先级越高

SELECT关键字对应的查询类型

所查的表名

匹配的分区,对于未分区的表,值为null

表内数据的访问方式

可能用到的索引

实际用到的索引

所选索引的字段长度

当使用索引等值查询时,与索引作比较的列或常量

预计要读取的行数

按表条件过滤后,留存的记录数的百分比

附件信息补充

具体字段含义分析:

id

SELECT标识符,是查询中SELECT的序号,其排列顺序代表整个查询中SELECT语句的执行顺序,值越高优先级越高。

select_type

标识查询的类型,主要用于区分该条SELECT语句所属的类别,如普通查询、联合查询、子查询等,常见的值如下:

  • SIMPLE:简单查询,不包含UNION或者子查询。
  • PRIMARY:查询中如果包含子查询或其他部分,则外层SELECT将被标记为PRIMARY。
  • SUBQUERY:子查询中的第一个SELECT
  • UNION:在UNION语句中,UNION之后出现的SELECT。
  • DERIVED:在FROM中出现的子查询被标记为DERIVED
  • UNION RESULT:UNION查询的结果

table

所查询的表名,表名除了正常的数据库表名以为,也可能是以下列出的值:

  • <unionM,N> : 本行引用了 id 为 M 和 N 的行的 UNION 结果;
  • <derivedN> : 本行引用了 id 为 N 的表所产生的的派生表结果。派生表有可能产生自 FROM 语句中的子查询。
  • <subqueryN> : 本行引用了 id 为 N 的表所产生的的物化子查询结果。

type(重要)

查询表内数据的方式,描述了查询具体数据是如何执行的,其中按照性能从高到底依次为:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。

常见的几种类型具体含义如下:

  • system:如果表使用的引擎对于表行数统计是精确的(如:MyISAM),且表中只有一行记录的情况下,访问方法是 system ,是 const 的一种特例。
  • const:根据主键或者唯一索引查询,索引值是常量值时。explain select * from emp where empno=7369;
  • eq_ref:根据主键或者唯一性索引查询。索引值不是常量值
  • ref:使用了非唯一的索引进行查询。
  • range:使用了索引,扫描了索引树的一部分
  • index:表示用了索引,但是也需要遍历整个索引树
  • all全表扫描

possible_keys

该查询可能会用到的索引

key

实际用到的索引

key_len

查询过程中所用到的索引列占的总字节数

rows

查询扫描的预估计行数

Extra

与查询相关的额外信息和说明

常见的值如下:

  • Using filesort:在排序时使用了外部的索引排序,没有用到表内索引进行排序。
  • Using temporary:MySQL 需要创建临时表来存储查询的结果,常见于 ORDER BY 和 GROUP BY。
  • Using index:表明查询使用了覆盖索引,不用回表,查询效率非常高。
  • Using index condition:表示查询优化器选择使用了索引条件下推这个特性。
  • Using where:表明查询使用了 WHERE 子句进行条件过滤。一般在没有使用到索引的时候会出现。
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库中,执行计划是用来描述数据库查询语句的执行方式和步骤的详细计划。其中,执行计划中的"Type"字段是指每个操作的类型。下面是一些常见的执行计划类型及其含义: 1. Full Table Scan(全表扫描):对于没有索引或者无法使用索引的查询,数据库需要扫描整个表来找到符合条件的数据。 2. Index Scan(索引扫描):使用索引进行查询,数据库根据索引的键值来定位符合条件的数据。 3. Index Unique Scan(唯一索引扫描):类似于索引扫描,但是该扫描只返回符合条件的第一条数据。 4. Index Range Scan(范围索引扫描):使用索引进行范围查询,数据库根据索引的键值范围来定位符合条件的数据。 5. Nested Loop Join(嵌套循环连接):对于两个表进行连接操作时,外层表的每一行都与内层表进行比较,以确定连接条件是否满足。 6. Hash Join(哈希连接):对于两个表进行连接操作时,将其中一个表按照连接条件进行哈希分组,然后将另一个表的数据进行哈希匹配。 7. Merge Join(合并连接):对于两个已经排序的表进行连接操作时,通过比较两个表的排序列来确定连接条件是否满足。 8. Sort(排序):对查询结果进行排序操作。 9. Group By(分组):对查询结果进行分组操作,并计算每个分组的聚合值,如求和、平均值等。 10. Aggregate(聚合):对查询结果进行聚合操作,如求和、平均值等,但不涉及分组。 这些只是一些常见的执行计划类型,实际上还有其他更复杂的类型。执行计划的选择取决于查询语句的复杂度、表的大小、索引的使用情况等多个因素。通过分析执行计划,可以帮助我们优化查询语句的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值