MySQL —— explain 查看执行计划与 MySQL 优化

10 分钟教会你如何看懂 MySQL 执行计划 通常查询慢查询SQL语句时会使用EXPLAIN命令来查看SQL语句的执行计划,通过返回的信息,可以了解到Mysql优化器是如何执行SQL语句,通过分析可以帮助我们提供优化的思路。 阅读详情
AI摘要

本文详细介绍MySQL中explain命令的使用,解析执行计划各字段含义,并结合索引优化、JOIN策略、ORDER BY和GROUP BY等场景,提供SQL性能调优方案,帮助开发者提升数据库查询效率。

explain 查看执行计划

使用 explain 关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理 SQL 语句的。可以获得关于查询的执行计划的详细信息,分析查询语句或者表结构的性能瓶颈。在 5.6 以及以后的版本中,除了 select,其他比如 insert,update 和 delete 均可以使用 explain 查看执行计划,从而知道 mysql 是如何处理 sql 语句,分析查询语句或者表结构的性能瓶颈。

explain 的作用——查看执行计划

通过 explain+sql 语句可以知道如下内容:

  1. 表的读取顺序(对应 id);
  2. 数据读取操作的操作类型(对应 select_type);
  3. 可以使用的索引(对应 possible_keys);
  4. 实际使用的索引(对应 key);
  5. 表之间的引用(对应 ref)
  6. 每张表被优化器查询的行数 。(对应 rows);

explain 查看执行计划返回信息详解

查看执行计划返回列如下:

表的读取顺序(id)
  • id 列指示了各个表在查询中的读取顺序。对于联合查询,id 的值越大,表示该表的读取优先级越高。相同的 id 表示这些操作是同时进行的。

    • id 相同,执行顺序由上到下。如下:t1->t3->t2。

    • id不同,如果是子查询,id 的序号会递增,id 值越大优先级越高,越先被执行。如下:t3->t1->t2。

    • id同时存在相同与不同。id 越大越先执行,id 相同从上到下顺序执行。

规则:

  1. id 相同,执行顺序由上至下;
  2. id 不同,如果是子查询,id 的序号会递增,id 值越大优先级越高,越先被执行。
查询类型(select_type)

表示查询中每个选择的类型。主要用于区别普通查询,联合查询,子查询等的复杂查询。常见的值包括:

  1. simple —— 简单的 select 查询,查询中不包含子查询或者 UNION 查询;
  2. primary —— 查询中若包含任何复杂的子部分,最外层查询被标记;
  3. subquery —— 在 select 或 where 列表中包含的子查询;
  4. derived —— 在 from 列表中包含的子查询被标记为 derived(衍生),MySQL 会递归执行这些子查询,把结果放到临时表中。
  5. union —— 如果第二个 select 出现在 UNION 之后,则被标记为 UNION;如果 union 包含在 from 子句的子查询中,外层 select 被标记为 derived。
  6. union result:从 UNION 表获取结果的 SELECT。
数据库表名(table)
  • 显示这一行的数据是关于哪张表的。
联接类型(type)

显示查询使用的连接方法,按照性能从好到坏的排序:system > const > eq_ref > ref > range > index > ALL。

  1. system:这是 const 类型的特例,仅当表中只有一行数据(且为系统表,例如 information_schema 中的表)时出现。是最优的连接类型,无需扫描,直接获取数据。

    在这种情况下,MySQL 不需要进行任何查找,直接返回结果。

  2. const:通过主键索引或唯一索引查询,且匹配条件是常量值,最多返回一行数据。const (常量值)与 primary key 或者 unique 索引比较,最多只匹配一行数据。性能极佳,只需一次索引查找即可定位数据。

    -- 找到一行数据,where 条件使用 =
    -- id为主键
    EXPLAIN SELECT * FROM tb1 WHERE id = 1; 
    
  3. eq_ref:在多表连接中,对于前表的每一行,后表通过主键或唯一索引返回唯一一行匹配的数据。常见于 JOIN 语句中被连接表的连接条件是主键或唯一索引的场景。

    -- 找到一行数据,where 条件使用 =
    -- 在多表连接中,使用主键或唯一索引进行连接
    -- users表的 type 可能为 eq_ref(对于 orders表的每一行,users表有唯一匹配)。
    EXPLAIN SELECT * FROM orders JOIN users ON orders.user_id = users.id;
    
  4. ref:通过非唯一性索引扫描,返回匹配的多个行,本质上也是一种索引访问,可能会找多个符合条件的行,属于查找和扫描的混合体。

    -- 找到多行数据,where 条件使用 =,也就是有多行满足等于条件的行
    -- ategory_id 是一个非唯一索引
    EXPLAIN SELECT * FROM articles WHERE category_id = 5;
    
  5. index_merge:MySQL 对同一个表使用多个索引,并将多个索引的结果合并(如 AND 或 OR 组合),以优化查询,依赖于合并的索引效率和结果集大小。

    -- id 和 name 均有索引
    EXPLAIN SELECT * FROM user WHERE id = 100 OR name = '张三'; 
    
  6. range:使用索引进行范围扫描。检索给定范围的行,返回一个范围的行。一般就是 where 语句中出现了 between,<,>,in 等范围的查询。这种范围扫描索引扫描比全表扫描要好,因为它开始于索引的某一个点,而结束另一个点,不用全表扫描。

    -- 找到多行数据,where 条件使用范围条件
    -- price  是一个索引;
    EXPLAIN SELECT * FROM products WHERE price BETWEEN 10 AND 20;
    
  7. index: 全索引扫描,表示扫描整个索引而不是表。all 与 index 区别为 index 类型只遍历索引树。通常比全表扫描快,因为索引文件比数据文件小很多。(相当于索引覆盖,只在索引文件查找便能获取结果)

    -- name 是一个索引;
    EXPLAIN SELECT * FROM products WHERE name LIKE 'A%';
    
  8. all:全表扫描,效率最低。遍历全表以找到匹配的行。(不使用索引或索引失效)

    注意:一般保证查询至少达到 range 级别,最好能达到 ref。

    SELECT * FROM users;
    
可用的索引(possible_keys)
  • 显示可能应用在这张表中的索引。查询涉及的字段上若存在多个索引,则索引将被列出,但不一定被查询实际使用。如果该字段为 NULL,表示没有可用的索引。(可能会列出如 idx_name、idx_age 等)
实际使用的索引(key)
  • 显示 MySQL 实际使用的索引。如果该字段为 NULL,表示查询没有使用索引。查询中如果使用覆盖索引,则该索引和查询的 select 字段重叠。(如果查询使用了 idx_age 索引,则显示为 idx_age)
使用的索引长度(key_len)
  • 表示 MySQL 在查询中使用的索引的字节数,帮助评估索引选择的效率。在不损失精度的情况下,长度越短越好。如果键是 NULL,则长度为 NULL。该字段显示为索引字段的最大可能长度,并非实际使用长度,即 key_len 是根据表定义计算而得,不是通过表内检索出的。如果 key_len 为 4,
MYSQL EXPLAIN执行计划详解 mysql查询优化器在基于成本和规则对一条查询语句进行优化后,会生成一条执行计划,这个执行计划展示了接下来执行查询的具体方式,比如多表连接的顺序是什么,采用什么访问方法来具体查询每个表等。设计mysql的大叔贴心地提供explain语句,可以让我们查看某个查询语句的具体执行计划。除了select开头的查询语句,其余的delete,insert,update,replace语句前面都可以加上explain这个词,用来查看这些语句的执行计划。 阅读详情

相关推荐

如何查看MySQL 的执行计划?

MySQL 执行计划(EXPLAIN)是SQL性能调优的关键工具,通过分析查询的执行路径和策略来优化性能。主要字段包括:type(访问类型,从最优system到最差ALL)、key(实际使用索引)、rows(预估扫描行数)和Extra(额外信息如Using index/Using filesort)。通过EXPLAIN命令可获取执行计划,重点解读type判断查询效率,分析Extra发现优化点(如避免全表扫描、利用覆盖索引)。实战中需关注索引使用情况,通过建立合理复合索引来优化查询,消除Using files

学习Java技术栈 1559

MySQL---SQL优化上(explain分析执行计划、查看SQL的执行效率、定位低效率SQL)

1) id列,用户登录mysql时,系统分配的"connection_id",可以使用函数connection_id()查看。5) command列,显示当前连接的执行的命令,一般取值为休眠(sleep),查询(query),连接。7) state列,显示使用当前连接的sql语句的状态,是一个很重要的列。id 字段是 select查询的序列号,是一组数字,表示的是查询中执行select子句或者是操作表的顺。3) host列,显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题语句的用户。

weixin_43961909的博客 2452

【C++】auto关键字(C++11,超详细解析,小白必看系列)

本文详细解析了C++中的“auto”关键字,介绍了其定义、基本用法、限制和高级用法,特别是与范围for循环和Lambda表达式结合的应用。

m0_73494049的博客 6万+

细聊Oracle通过ODBC数据源连接SQL Server数据库

    类似文章搜索引擎上有很多,内容大致相同,今天所谓细聊是因为我在借鉴这些文章时候走了些弯路,所以写此文,为自己备忘,同时如果能为初涉此处知识点的小伙伴提供些帮助就更好了,废话不多说。    我的应用场景:    项目系统使用oracle数据库,与客户的第三方系统供应商实现资源共享,对方为sql server数据库;    我的测试开发环境为64bitwin7PC机,本机上装有64位Oracl...

xueren_83的博客 1万+

吃透Chisel语言.04.Chisel基础(一)——信号类型和常量

开始肯定是介绍Chisel的基础内容了,《Chisel基础》这一部分主要会介绍数字设计中的两个基本组件:组合电路和触发器。这俩基本组件都不复杂,但是组合在一起就可以得到规模很大、功能也很强大的数字电路了。 第一部分我们就简单地看看Chisel中的信号类型和常量,在上一篇文章中也有相关介绍,其中还包括和Verilog之间的对比。......

github-3rr0r的博客 3823

避坑指南:Unity与Visual Studio开发环境配置中的5个常见问题及解决方案

本文针对Unity与Visual Studio开发环境配置中的5个常见问题,提供了详细的解决方案。重点解决了项目文件生成失败导致命名空间无法识别、调试器无法附加、包管理器与扩展安装混乱、脚本编译错误以及多版本环境冲突等核心痛点,帮助开发者构建稳定高效的开发调试环境。

weixin_27791839的博客 281

手把手教你搞定CAC会议投稿:从LaTeX模板到PDF eXpress避坑全流程

本文详细解析CAC会议投稿全流程,重点介绍LaTeX模板调整、Turnitin查重技巧及PDF eXpress校验避坑指南。通过实战案例和代码示例,帮助研究者高效完成IEEE格式论文投稿,避免常见技术性失误,提升投稿成功率。

weixin_29969209的博客 397

还原 Windows 环境变量的默认值

有时候,我们可能需要还原环境变量的默认值,以修复可能的配置问题或恢复系统的正常运行。如果您只想还原某个特定的环境变量,可以跳过删除其他变量的步骤,仅删除需要还原的变量即可。在“环境变量”对话框中,继续向下滚动到“系统变量”部分。请注意,在执行以下步骤之前,您应该备份当前的环境变量设置,以便在需要时可以还原。在删除所有需要还原的环境变量后,点击“确定”按钮关闭“环境变量”对话框。在“用户变量”部分,选择需要还原的变量,然后点击“删除”按钮。在“高级”选项卡下方的“环境变量”部分,点击“环境变量”按钮。

PvDeveloper的博客 6342

微观交通流仿真软件:SUMO (Simulation of Urban MObility)_(1).SUMO入门与基础概念

SUMO(Simulation of Urban MObility)是一个开源的微观交通流仿真软件,用于模拟城市交通系统中的各种动态行为。SUMO不仅可以模拟车辆的行驶,还可以模拟行人、自行车、公交车等交通参与者的运动。通过SUMO,研究人员和工程师可以对交通系统进行详细建模和分析,从而优化交通规划、评估交通政策和设计智能交通系统。车辆路径规划:SUMO可以模拟车辆在路网中的路径选择,包括动态路径选择和静态路径选择。交通信号控制:支持多种交通信号控制策略,包括固定时间控制、自适应控制等。多模式交通:模拟不同

kkchenjj的博客 1182

软件设计师考试下午题代码部分详解:23种设计模式全面解析

软件设计师考试的下午题通常会考察设计模式的应用,这部分内容既是重点也是难点。本文将系统地介绍考试中常见的23种设计模式,通过详细代码示例和通俗易懂的讲解,帮助考生掌握这些核心知识点,提高应试能力。概念:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。适用场景:系统要独立于产品的创建、组合和表示时;系统要由多个产品系列中的一个来配置时。@Override@Override@Override@Override// 产品族A@Override。

4万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: MySQL —— MySQL索引介绍、索引数据结构、聚集索引和辅助索引、索引覆盖
下一篇: MySQL——MySQL 日志
ShareBeHappy_Qin
博客等级 码龄9年 2321粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值