Mysql查询优化——Explain使用

MySQL进阶系列: 一文详解explain各字段含义 explain有何用处呢:为了知道优化SQL语句的执行,需要查看SQL语句的具体执行过程,以加快SQL语句的执行效率。 可以使用explain+SQL语句来模拟优化器执行SQL查询语句,从而知道mysql是如何处理sql语句的。通过查看执行计划了解执行器是否按照我们想的那样处理SQL。 explain执行计划中包含的信息如下: id: 查询序列号 select_type: 查询类型 table: 表名或者别名 partitions: 匹配的分区 type: 访问类型 possible_keys: 可能用到 阅读详情

The palest ink is better than best memory——好记性不如烂笔头。2012补记


一、关键词

SQL优化、执行计划、explain、using filesort、using temporary

二、摘要

开发中,为满足一业务功能,使用mysql书写sql时,一条sql往往有多种写法,那么我们就需要选择执行效率比较高的sql。
因此要比较分析sql的执行过程,且同一条sql我们要比较选择使用最优索引。
通过explain命令可以得到:
这里写图片描述

整体执行顺序(子查询)、查询类型、使用什么表(表 泛指)、数据访问/读取操作类型、使用到索引等。

先整体了解下SQL查询的基本执行过程:

1)应用通过MySQL API把查询命令发送给MySQL服务器,然后被解析

2)检查权限、MySQL optimizer进行优化,经过解析和优化后的查询命令被编译为CPU可运行的二进制形式的查询计划(query
plan),并可以被缓存

3)如果存在索引,那么先扫描索引,如果数据被索引覆盖,那么不需要额外的查找,如果不是,根据索引查找和读取对应的记录

4)如果有关联查询,查询次序是扫描第一张表找到满足条件的记录,按照第一张表和第二张表的关联键值,扫描第二张表查找满足条件的记录,按此顺序循环

5)输出查询结果,并记录binary logs

三、Explain返回信息:

列名说明
id执行编号,标识select所属的行。如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1。否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置
select_type显示本行是简单或复杂select。如果查询有任何复杂的子查询,则最外层标记为PRIMARY(DERIVED、UNION、UNION RESUlT)
table访问引用哪个表(引用某个查询,如“derived3”)
type数据访问/读取操作类型(ALL、index、range、ref、eq_ref、const/system、NULL)
possible_keys揭示哪一些索引可能有利于高效的查找
key显示mysql决定采用哪个索引来优化查询
key_len显示mysql在索引里使用的字节数
ref显示了之前的表在key列记录的索引中查找值所用的列或常量
rows为了找到所需的行而需要读取的行数,估算值,不精确。通过把所有rows列值相乘,可粗略估算整个查询会检查的行数
Extra额外信息,如using index、filesort等

  • select_type列:
select_type类型说明
SUBQUERY在select列表中的子查询,如SELECT *,(SELECT id FROM product_info) AS id FROM product_info
DERIVED在from子语句中子查询,如SELECT * FROM product_info p1 ,(SELECT * FROM product_info) p2.Mysql会递归执行,并把结果放到临时表中
UNION在UNION中第二个和随后的SELECT被标记为UNION
UNION RESULT用来从UNION的匿名临时表检索结果的SELECT被标记为UNION RESULT

  • type列(依次从最差到最优):
type类型说明
All最坏的情况,从头到尾全表扫描
index和全表扫描一样。只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。如在Extra列看到Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要小很多
range范围扫描,一个有限制的索引扫描。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可以使用 range
ref一种索引访问,它返回所有匹配某个单个值的行。此类索引访问只有当使用非唯一性索引或唯一性索引非唯一性前缀时才会发生
eq_ref最多只返回一条符合条件的记录。使用唯一性索引或主键查找时会发生 (高效)
const/system当主键放入where子句时,mysql把这个查询转为一个常量(高效)
Null意味说mysql能在优化阶段分解查询语句,在执行阶段甚至用不到访问表或索引(高效)

  • Extra列常见情况(需要优化):
Extra情况说明
Using temporary表示 MySQL 在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by
Using filesort表示 MySQL 会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容。可能在内存或者磁盘上进行排序。MySQL 中无法利用索引完成的排序操作称为“文件排序”

四、事例(2012公司项目):

案例1:

EXPLAIN
SELECT e1.*,0 AS 'hasCount' FROM eticketdetail e1 WHERE e1.brandUserId =5303 AND e1.status =1 AND e1.parentId =0 
UNION  
SELECT e2.*,0 AS 'hasCount' FROM eticketdetail e2 WHERE e2.status =1 AND  e2.id IN (SELECT e3.parentId FROM eticketdetail e3 WHERE  e3.parentId >0 AND e3.brandUserId = 5303)
ORDER BY createtime LIMIT 0,10

这里写图片描述

EXPLAIN
SELECT e1.*,0 AS 'hasCount' FROM eticketdetail e1 WHERE e1.brandUserId =5303 AND e1.status =1 AND e1.parentId =0 
UNION  
SELECT e2.*,0 AS 'hasCount' FROM eticketdetail e2 WHERE e2.status =1 AND  EXISTS (SELECT 1 FROM eticketdetail e3 WHERE  e3.parentId >0 AND e3.brandUserId = 5303)
ORDER BY createtime LIMIT 0,10

这里写图片描述

EXPLAIN
SELECT e1.*,0 AS 'hasCount' FROM eticketdetail e1 WHERE e1.brandUserId =5303 AND e1.status =1 AND e1.parentId =0 
UNION  
SELECT e2.*,0 AS 'hasCount' FROM eticketdetail e2 INNER JOIN (SELECT e3.parentId FROM eticketdetail e3 WHERE  e3.parentId >0 AND e3.brandUserId = 5303) tab ON e2.id = tab.parentid  WHERE e2.status =1 
ORDER BY createtime LIMIT 0,10

这里写图片描述


案例2:

第一种写法:
SELECT 
  mp.*
FROM memberpromotion mp
  INNER JOIN memberpromotionlocation mpl
    ON mpl.MemberPromotionID = mp.ID
WHERE mp.status = 1
    AND mp.BrandUserID = 2402
AND mpl.shopId = 0
第二种写法:
SELECT 
  mp.*
FROM (SELECT * FROM memberpromotion memb WHERE memb.BrandUserID = 2402) mp
  INNER JOIN memberpromotionlocation mpl
    ON mpl.MemberPromotionID = mp.ID
WHERE mp.status = 1
AND mpl.shopId = 0

这里写图片描述


案例3:

第一幅图语句:
SELECT SQL_NO_CACHE
  e.*,
  (SELECT
     COUNT(id)
   FROM eticketdetail
   WHERE userId = e.userId
       AND orderId = e.orderId
       AND promotionId = e.promotionId
       AND promotionProductId = e.promotionProductId
       AND STATUS != 3
       AND STATUS = 0 ) AS 'hasCount'
FROM eticketdetail e
WHERE userId = 5302
    AND isGift = 0 AND isReal = 0 AND STATUS = 0
GROUP BY userId,orderId,promotionId,promotionProductId 
UNION 
SELECT e.*, 1    AS 'hasCount' FROM eticketdetail e
WHERE userId = 5302  AND isGift = 1 AND STATUS = 0
ORDER BY CreateTime DESC
第二幅图语句:(UNION改为UNION ALL)
SELECT SQL_NO_CACHE
  e.*,
  (SELECT
     COUNT(id)
   FROM eticketdetail
   WHERE userId = e.userId
       AND orderId = e.orderId
       AND promotionId = e.promotionId
       AND promotionProductId = e.promotionProductId
       AND STATUS != 3
       AND STATUS = 0 ) AS 'hasCount'
FROM eticketdetail e
WHERE userId = 5302
    AND isGift = 0
    AND isReal = 0
    AND STATUS = 0
GROUP BY userId,orderId,promotionId,promotionProductId 
UNION ALL
SELECT e.*, 1    AS 'hasCount' FROM eticketdetail e
WHERE userId = 5302  AND isGift = 1 AND STATUS = 0
ORDER BY CreateTime DESC
第三幅图: 增加userId索引后
第四幅图:
SELECT 
  e.*,
  tab.t AS 'hasCount'
FROM eticketdetail e 
INNER JOIN (
    SELECT id,COUNT(id) AS t FROM eticketdetail WHERE userid=5302  AND isGift = 0 AND isReal = 0 AND STATUS != 3 AND STATUS = 0 GROUP BY orderId,promotionId,promotionProductId ORDER BY NULL
) tab ON tab.id = e.ID
WHERE userId = 5302
    AND isGift = 0
    AND isReal = 0
    AND STATUS = 0
GROUP BY orderId,promotionId,promotionProductId 
UNION ALL
SELECT e.*, 1    AS 'hasCount' FROM eticketdetail e
WHERE userId =5302  AND isGift = 1 AND STATUS = 0
ORDER BY CreateTime DESC

这里写图片描述

这玩意,只有动手多折腾比较几下~

五、参考:

1.《高性能MySQL》第3版
2.官网:http://dev.mysql.com/doc/refman/5.7/en/explain-output.html

MySQL EXPLAIN 详解 EXPLAIN 是 MySQL 提供的性能分析工具,用于查看 SQL 查询的执行计划(即优化器如何执行查询)。它通过模拟查询过程(不实际执行 SQL)返回一个表格,展示索引使用、表连接方式、扫描行数等关键信息,帮助开发者诊断性能瓶颈并优化查询。核心作用:基本语法: FORMAT:指定输出格式,默认是表格形式(TRADITIONAL),JSON 格式包含更详细信息。 示例: 输出结果示例:性能瓶颈难以定位索引优化盲目性资源浪费与扩展性问题维护成本高必用 EXPLAIN 的场景:快速优化步骤:通过 EXPL 阅读详情

相关推荐

MySQL之查询优化(EXPLAIN)

查询优化器 查询瓶颈 CPU饱和(读取数据至内存 or 将数据持久化至硬盘) IO饱和(读取数据远大于内存容量) 硬件制约(top,free,iostat,vmstat等系统性能状态) 执行计划(EXPLAIN) 使用EXPLAIN关键字可以模拟查询优化器执行SQL查询语句,从而知道MySQL数据库是如何处理SQL语句,以及应该从哪个方面对SQL语句进行优化 作用 查看表的读取顺序 数据读取的操作类型 哪些索引可以使用 实际使用了那些索引 表之间的引用关系 有多少行数据被优化器查询 执行计划字段介

会者定离,一期一祈 2705

Explain详解与索引最佳实践

Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是 执行这条SQL 注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中 Explain分析示例 参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html 1 示例表: 2 D

weixin_39585051的博客 567

MySQL 进阶:查询优化 - EXPLAIN

通过本文的介绍,我们详细解释了EXPLAIN的基本概念和使用方法,帮助你更好地理解和优化MySQL数据库的性能。希望这些信息能够帮助你在实际项目中提高数据库的查询性能,提升系统的整体表现。如果你有任何疑问或想要分享的经验,欢迎留言交流!😊通过上述内容,我们不仅介绍了EXPLAIN的基本概念和使用方法,还讨论了其在实际应用中的优势和挑战。希望这些信息对你有所帮助,让你在MySQL数据库管理的道路上更进一步。😊。

墨夶的博客 1686

MySQL-Explain详解

MySQL-Explain详解

fsdfkjai的博客 7万+

【Mysql进阶】5步精通MySQL查询优化:EXPLAIN到底能帮我们什么?

EXPLAIN。

java专栏 1299

ubuntu18.04安装xenomai3.1(百分百成功版)

ubuntu18.04安装xenomai3.1(百分百成功版),保姆级教学!!!

h542812556sdu的博客 2062

MySQL高级知识(四)——Explain

  前言:explain(执行计划),使用explain关键字可以模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql语句。explain主要用于分析查询语句或表结构的性能瓶颈。 注:本系列随笔如无特殊说明都MySQL版本都为5.7.22。 1.explain的作用 通过explain+sql语句可以知道如下内容: ①表的读取顺序。(对应id) ②数据读取操作的操作类型。(...

thedarkclouds的博客 3241

VisionMaster4.2.0与C#控件开发实战:从入门到精通的完整指南

本文详细介绍了VisionMaster4.2.0与C#控件开发的实战指南,从基础环境搭建到核心控件使用,再到高级功能实现。通过VmFrontendControl、VmGlobalToolControl等核心控件的深入解析,帮助开发者快速掌握机器视觉应用开发技巧,提升开发效率。特别适合需要集成VisionMaster4.2.0 SDK进行视觉系统开发的C#程序员。

weixin_42665725的博客 383

MySQL 查询优化与 EXPLAIN 关键字详解

MySQL 中的EXPLAIN关键字是优化数据库查询的重要工具,通过分析查询执行计划可以帮助开发人员找出潜在的性能瓶颈,并进行相应的优化。合理设计索引、优化查询语句结构、分析执行计划等策略可以提升数据库性能,改善应用程序的响应速度和用户体验。希望本文能够帮助读者更好地理解 MySQL 查询优化和EXPLAIN关键字的作用,从而在实际开发中提升数据库性能,改善应用程序的用户体验。

2301_82147294的博客 2333

宜搭子表单(自定义页面全部展示)

效果:增加自定义页面添加表格组件,配置数据源变量: formUuid'表单编码'变量: pageSize10变量: currentPage1。

2301_80286061的博客 2276

PCB激光直接成像(LDI)设备技术解析与优化方案

激光直接成像(LDI)是PCB制造中的关键数字化工艺,通过激光束直接在基板上形成电路图案。其核心技术在于高精度光学系统与智能控制算法的结合,工作精度可达微米级。在HDI板、柔性电路等高端PCB制造中,LDI技术能显著提升线宽精度和层间对位准确性。当前行业面临材料适配性、热变形控制等挑战,动态能量补偿、多波长曝光等创新方案正在突破这些瓶颈。随着模块化设计、预测性维护等工程实践的普及,LDI设备综合效率持续提升,为5G、汽车电子等领域的精密电路生产提供关键技术支撑。

weixin_29168393的博客 390

mysql通过explain优化查询

3)union:union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union。5)union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null。有连接查询时,外层的查询为simple,且只有一个。4)dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响。2)const:常量连接。

zhangzhangdan的博客 920

vue3的面试题

vue3的面试题

jiang7701037的博客 6263

MySQL查询优化之explain的深入解析

在分析查询性能时,考虑EXPLAIN关键字同样很管用。EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。explain 可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们查询,让查询优化器能够更好的工作。 一、MySQL 查询优化器是如何工作的 MySQL 查询优化器有几个目标,

新技术革命 469

Spine动画在Unity里卡顿、闪烁、排序错乱?这些性能优化与渲染问题一次讲清

本文深入解析了Spine动画在Unity中常见的卡顿、闪烁和排序错乱问题,提供了全面的性能优化与渲染解决方案。从性能瓶颈诊断到材质合并、动态合批优化,再到层级错乱与Alpha闪烁的处理,帮助开发者提升动画表现和运行效率。特别针对Unity和Spine的协同工作进行了详细的技术探讨。

weixin_29967445的博客 379

2024年数字IC秋招-睿思芯科-IC验证工程师-笔试题

公司介绍:初创公司,做risc-v,公司位于深圳笔试题型:基础题(10个) + 选做题(5个)笔试平台:showmebug(电脑监控)笔试时间:1h个人感受:每年rsxk的题目好像是一样的,起码今年和去年的题目是相同的,但是做完笔试题目就没有消息了。

qq_42135020的博客 1582

mysql优化 explain_MySQL查询优化之explain的深入解析

在分析查询性能时,考虑EXPLAIN关键字同样很管用。EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。explain 可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们查询,让查询优化器能够更好的工作。一、MySQL 查询优化器是如何工作的MySQL 查询优化器有几个目标,但是其中...

weixin_31759799的博客 207

ICC2:mem出pin的Off Grid问题

这个命令本意是解决跨制成调用IP时在IP出pin位置加一定的routing blockage,限制绕线在一定范围内只能走直线出pin,用来解决off-grid问题也有很好的效果。在ICC2做先进工艺时会有off-grid的问题,off-grid可以理解为绕线没有在preferred方向track上。测试发现,2022版本以前的ICC2绕线容易有off-grid问题。主要在mem出pin的M2/M3层次上,切换版本绕线能很大程度上解决这个问题。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1630

MySQL 查询优化之EXPLAIN

EXPLAIN命令可以用于任何SELECT语句,展示MySQL如何使用索引来处理SELECT语句以及连接表。它显示了MySQL如何执行查询,包括如何表连接以及选择索引的情况。

2401_83616384的博客 488

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

pscad IEEE标准系统搭建说明

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

【Mysql优化】EXPLAIN 返回列详解:深入 SQL 查询优化的工具

EXPLAIN是 MySQL 提供的分析查询计划的命令,执行后会返回一张表格,展示 SQL 查询在实际执行时会采用的策略。是否进行了全表扫描。索引是否被正确利用。哪些地方需要优化。通过对EXPLAIN返回列的理解和应用,我们可以识别查询的性能瓶颈。使用合适的索引,避免全表扫描。优化子查询,尽量减少嵌套层级。使用EXPLAIN定位问题,逐步优化查询结构。总是学不会.

学不会就接着学 1539

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

MySQL查询优化神器:EXPLAIN命令详解与实战

一个高效的查询不仅可以节省资源,还能提升用户体验。然而,如何才能知道你的SQL查询是否高效呢?这时,EXPLAIN 就成为了你的得力助手。

weixin_59930657的博客 956

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

mysql的 explain_MySQL查询优化之explain的深入解析

本篇文章是对MySQL查询优化中的explain进行了详细的分析介绍,需要的朋友参考下在分析查询性能时,考虑EXPLAIN关键字同样很管用。EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。explain 可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们查询,让查询优化器能够更好的...

weixin_30638387的博客 97

MySQL - 查询优化指南之『EXPLAIN 命令』详解

EXPLAIN 是 MySQL 中用于分析 SQL 查询执行计划的关键工具,它能帮助开发者理解查询的执行方式并找出性能瓶颈。下面我将详细介绍 EXPLAIN 的使用方法和输出字段的含义,并通过实际示例说明如何优化查询。

qq_45696804的博客 1682

【EXPLAIN详解:MySQL查询优化师的显微镜】

MySQL EXPLAIN深度解析: EXPLAIN是MySQL查询优化的核心工具,能透视SQL执行计划,精准定位性能瓶颈。本文详解EXPLAIN关键字段(type、key、rows、Extra等),通过真实案例展示如何优化慢查询:从索引缺失导致的全表扫描(优化后提速1000倍)到消除低效排序(filesort优化),再到复杂联表查询的索引策略。高级技巧涵盖JSON格式分析、EXPLAIN ANALYZE实战及自动化优化脚本,并总结索引失效常见场景(如函数调用、隐式类型转换)。

weixin_64178283的博客 1415
上一篇: Linux环境、基本软件安装配置
下一篇: Mysql随机取样——ORDER BY RAND()优化
易德军
博客等级 码龄19年 134粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值