MySQL高级 之 explain执行计划详解

MySQL高级 之 explain执行计划详解使用 explain 关键字可以模拟优化器执行 SQL 查询语句 从而知道 MySQL 是如何处理你的 SQL 语句的 分析你的查询语句或是表结构的性能瓶颈 explain 执行计划包含的信息其中最重要的字段为 id type key rows Extra 各字段详解 idselect 查询的序列号 包含一组数字 表示查询中执行 select 子句或操作表的顺序三种情况 1 id 相同 执行顺序由上至下 2 id 不同

使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。

explain执行计划包含的信息

这里写图片描述

其中最重要的字段为:id、type、key、rows、Extra

各字段详解

id

2、id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
这里写图片描述

3、id相同又不同(两种情况同时存在):id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
这里写图片描述

select_type

查询的类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询

1、SIMPLE:简单的select查询,查询中不包含子查询或者union
2、PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为primary
3、SUBQUERY:在select 或 where列表中包含了子查询
4、DERIVED:在from列表中包含的子查询被标记为derived(衍生),mysql或递归执行这些子查询,把结果放在零时表里
5、UNION:若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived
6、UNION RESULT:从union表获取结果的select
这里写图片描述





type

访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,好的sql查询至少达到range级别,最好能达到ref

1、system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,可以忽略不计

2、const:表示通过索引一次就找到了,const用于比较primary key 或者 unique索引。因为只需匹配一行数据,所有很快。如果将主键置于where列表中,mysql就能将该查询转换为一个const
这里写图片描述

3、eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键 或 唯一索引扫描。
这里写图片描述
注意:ALL全表扫描的表记录最少的表如t1表

4、ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质是也是一种索引访问,它返回所有匹配某个单独值的行,然而他可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体
这里写图片描述

5、range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了那个索引。一般就是在where语句中出现了bettween、<、>、in等的查询。这种索引列上的范围扫描比全索引扫描要好。只需要开始于某个点,结束于另一个点,不用扫描全部索引
这里写图片描述

6、index:Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常为ALL块,应为索引文件通常比数据文件小。(Index与ALL虽然都是读全表,但index是从索引中读取,而ALL是从硬盘读取)
这里写图片描述

7、ALL:Full Table Scan,遍历全表以找到匹配的行
这里写图片描述

possible_keys

查询涉及到的字段上存在索引,则该索引将被列出,但不一定被查询实际使用

key

key_len

表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。key_len是根据表定义计算而得的,不是通过表内检索出的

ref

显示索引的那一列被使用了,如果可能,是一个常量const。

rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

Extra

不适合在其他字段中显示,但是十分重要的额外信息

1、Using filesort
mysql对数据使用一个外部的索引排序,而不是按照表内的索引进行排序读取。也就是说mysql无法利用索引完成的排序操作成为“文件排序”
这里写图片描述
由于索引是先按email排序、再按address排序,所以查询时如果直接按address排序,索引就不能满足要求了,mysql内部必须再实现一次“文件排序”


2、Using temporary
使用临时表保存中间结果,也就是说mysql在对查询结果排序时使用了临时表,常见于order by 和 group by
这里写图片描述

3、Using index
表示相应的select操作中使用了覆盖索引(Covering Index),避免了访问表的数据行,效率高
如果同时出现Using where,表明索引被用来执行索引键值的查找(参考上图)
如果没用同时出现Using where,表明索引用来读取数据而非执行查找动作
这里写图片描述
覆盖索引(Covering Index):也叫索引覆盖。就是select列表中的字段,只用从索引中就能获取,不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖
注意:
a、如需使用覆盖索引,select列表中的字段只取出需要的列,不要使用select *
b、如果将所有字段都建索引会导致索引文件过大,反而降低crud性能







综合Case

这里写图片描述

执行顺序
1(id = 4)、【select id, name from t2】:select_type 为union,说明id=4的select是union里面的第二个select。

2(id = 3)、【select id, name from t1 where address = ‘11’】:因为是在from语句中包含的子查询所以被标记为DERIVED(衍生),where address = ‘11’ 通过复合索引idx_name_email_address就能检索到,所以type为index。

3(id = 2)、【select id from t3】:因为是在select中包含的子查询所以被标记为SUBQUERY。

4(id = 1)、【select d1.name, … d2 from … d1】:select_type为PRIMARY表示该查询为最外层查询,table列被标记为 “derived3”表示查询结果来自于一个衍生表(id = 3 的select结果)。

5(id = NULL)、【 … union … 】:代表从union的临时表中读取行的阶段,table列的 “union 1, 4”表示用id=1 和 id=4 的select结果进行union操作。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226032.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午8:00
下一篇 2026年3月17日 上午8:00


相关推荐

  • matlab中importdata无法打开文件_importdata无法打开文件

    matlab中importdata无法打开文件_importdata无法打开文件最近使用importdata函数不能读取全部数据,数据集315行,但是读取了197行,那就是197-198之间有问题,百度之后有了思路。由于没有找到具体的证据,所以这里说一下解决思路。import可以导入很多文件类型,.dat文件应该默认的是ASCII码,在编码处看到(我用的notepad++)使用的UTF-8编码,修改为使用ANSI编码,看一下结果UTF-8编码ANSI编码果然有问题,删除就可以了。这个数据是直接从网页端复制的,所以应该是哪里出了问题。…

    2025年6月3日
    6
  • ac测评题库_用标号法求网络最大流

    ac测评题库_用标号法求网络最大流给定一个包含 n 个点 m 条边的有向图,并给定每条边的容量,边的容量非负。图中可能存在重边和自环。求从点 S 到点 T 的最大流。输入格式第一行包含四个整数 n,m,S,T。接下来 m 行,每行三个整数 u,v,c,表示从点 u 到点 v 存在一条有向边,容量为 c。点的编号从 1 到 n。输出格式输出点 S 到点 T 的最大流。如果从点 S 无法到达点 T 则输出 0。数据范围2≤n≤10000,1≤m≤100000,0≤c≤10000,S≠T输入样例:7 14 1 71

    2022年8月9日
    8
  • keyvaluepair_KeyValuePair用法(转)

    keyvaluepair_KeyValuePair用法(转)C#KeyValuePair的用法。结构体,定义可设置或检索的键/值对。也就是说我们可以通过它记录一个键/值对这样的值。比如我们想定义一个ID(int类型)和Name(string类型)这样的键/值对,那么可以这样使用。//////设置键/值对//////privateKeyValuePairSetKeyValuePair(){intintKey=1;stringstrV…

    2022年7月26日
    10
  • IP多播(组播)

    IP多播(组播)本文主要讲解多播的基本概念以及使用多播方式进行数据传输的基本原理和方法

    2026年3月18日
    0
  • 点云数据处理方法

    点云数据处理方法这篇博客主要介绍三维计算机视觉中点云数据处理面对的问题 主要方法和技术 概述其特点 这篇博客主要介绍最基本的点云数据处理技术和概念 不会有任何代码 ICP 点云配准就是我们非常熟悉的点云处理算法之一 实际上点云数据在形状检测和分类 立体视觉 运动恢复结构 多视图重建中都有广泛的使用 点云的存储 压缩 渲染等问题也是研究的热点 随着点云采集设备的普及 双目立体视觉技术 VR 和 AR 的发展 点云数据处

    2026年3月19日
    3
  • 电磁场与电磁波实验 02 – | 电磁波波长测试实验

    电磁场与电磁波实验 02 – | 电磁波波长测试实验一 实验目的 1 学习了解电磁场电磁波的空间传播特性 2 通过对电磁场电磁波波长 波幅 波节 驻波的测量进一步认识和了解电磁场电磁波 3 了解电磁波的反射特性 利用迈克尔逊干涉现象和相干波原理测量波长二 预习要求 1 什么是迈克尔逊干涉原理 它在实验中有哪些应用 2 驻波的产生原理及其特性 三 实验仪器 HD CB V 电磁场电磁波数字智能实训平台极化天线 1 副金属反射板

    2025年9月30日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号