【MYSQL高级】Mysql的SQL性能分析【借助EXPLAIN分析】

news2024/11/15 18:01:53

性能分析

要说sql有问题,需要拿出证据,因此需要性能分析

Mysql查询优化器(Mysql Query Optimizer)

  1. Mysql中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划(它认为最优的数据检索方式,不见得是DBA认为是最优的,这部分最耗费时间,如果知道mysql底层是如何执行一条sql,可以帮助我们更好地优化sql)
  2. 当客户端向MySQL请求一条Query,命令解析器模块完成请求分类,区别出是 SELECT 转发给MysQL Query Optimizer,MysQL Query Optimizer首先会对整条Query进行优化,处理掉一些常量表达式的预算,直接换算成常量值。并对Query中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、进行结构调整。然后分析 Query 中的 Hint 信息(如果有),看显示Hint信息是否可以完全确定该Query 的执行计划。如果没有 Hint 或Hint 信息还不足以完全确定执行计划,则会读取所涉及对象的统计信息,根据 Query 进行写相应的计算分析,然后再得出最后的执行计划。

Mysql常见瓶颈

  • CPU: CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候
  • IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候
  • 服务器硬件的性能瓶颈(机器性能本来就弱): top,free,iostat和vmstat来查看系统的性能状态

EXPLAIN简介

EXPLAIN是什么?

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

EXPLAIN怎么使用?

语法:explain关键字 + 所写的SQL

【表格形式查看】

explain select * from tbl_emp;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vhQm9gzw-1687613436534)(assets/1687613388315-15.png)]

【列形式查看】

mysql> explain select * from pms_category \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: pms_category
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1425
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

EXPLAIN能干嘛?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F2t4Yivo-1687613436534)(assets/1687613388316-16.png)]

通过上面的表格可以查看以下信息:

id列 了解表的读取顺序

值有以下三种情况:

  • id相同,执行顺序由上至下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sOkucRTf-1687613436535)(assets/1687613388316-17.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-87bemwc1-1687613436535)(assets/1687613388316-18.png)]

  • id相同和不同 同时存在。永远是id大的优先级最高,id相等的时候从上到下顺序执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bwb5mibD-1687613436535)(assets/1687613388316-19.png)]

总结:id相同上下顺序走,不同id大的先走

select_type列 数据读取操作的操作类型。

select_type:数据查询的类型,主要是用于区别,普通查询、联合查询、子查询等复杂查询。

【常见值】

  • SIMPLE:简单的SELECT查询,查询中不包含子查询或者UNION
  • PRIMARY:查询中如果包含任何复杂的子部分,最外层查询则被标记为PRIMARY
  • SUBQUERY:在SELECT或者WHERE子句中包含了子查询。
  • DERIVED:在FROM子句中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表中。
  • UNION:如果第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT将被标记为DERIVED
  • UNION RESULT:从UNION表获取结果的SELECT

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C2S9AWRV-1687613436536)(assets/1687613388316-20.png)]

table列 表的名字

标题已经通俗易懂了,哈哈

type列 访问类型详解及排列

【type列常见值】

  • system:一张表只有一行记录(如系统参数表,每个参数字段只存储一个值),这是const类型的特例(平时不会出现,这个也可以忽略不计)
  • const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL就能将该查询转化为一个常量。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MQ9eNkRR-1687613436536)(assets/1687613388316-21.png)]

  • eq_ref:唯一性索引扫描,读取本表中和关联表表中的每行组合成的一行,查出来只有一条记录。除了 systemconst 类型之外, 这是最好的连接类型。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xqx8CeCU-1687613436536)(assets/1687613388317-22.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Exwr438-1687613436536)(assets/1687613388317-23.png)]

  • ref:非唯一性索引扫描,返回本表和关联表某个值匹配的所有行,查出来有多条记录

【例子1】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Julc3UOq-1687613436537)(assets/1687613388317-24.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y9binrsO-1687613436537)(assets/1687613388317-25.png)]

【例子2】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2NbJVrIg-1687613436537)(assets/1687613388317-26.png)]

  • range:只检索给定范围的行,一般就是在WHERE语句中出现了BETWEEN< >in等的查询。这种范围扫描索引比全表扫描要好,因为它只需要开始于索引树的某一点,而结束于另一点,不用扫描全部索引。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HCwOufiN-1687613436538)(assets/1687613388317-27.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0SWW6bk3-1687613436538)(assets/1687613388317-28.png)]

  • indexFull Index Scan,全索引扫描,indexALL的区别为index类型只遍历索引树,不用全表扫描。也就是说虽然ALLindex都是读全表,但是index是从索引中读的,ALL是从磁盘中读取的。**因为索引文件通常比数据文件小,所以Index往往比ALL快。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sdDYMVXw-1687613436538)(assets/1687613388317-29.png)]

  • ALLFull Table Scan,没有用到索引,全表扫描

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uvSsDYlB-1687613436538)(assets/1687613388317-30.png)]

从最好到最差依次是:system>const>eq_ref>ref>range>index>ALL。除了ALL没有用到索引,其他级别都用到索引了,表示全表扫描。

**总结:**多看sql的type,如果是All,争取优化成其他的,一般来说,得保证查询至少达到range级别,最好达到ref

possible_keys列 哪些索引可能被使用

possible_keys:显示可能应用在这张表中的索引,一个或者多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。

key列 哪些索引被实际使用(判断索引是否失效)

key:实际使用的索引。如果为NULL,则没有使用索引。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fsht2uWC-1687613436539)(assets/1687613388318-31.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gaUiBGzK-1687613436539)(assets/1687613388318-32.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rqS2jI2D-1687613436539)(assets/1687613388318-33.png)]

查询中如果使用了覆盖索引,则该索引仅仅出现在key列表中,不出现在possible_keys中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ChMVE3us-1687613436539)(assets/1687613388318-34.png)]

key_len列 索引中使用的字节数

key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

在不损失精度的情况下,长度越短越好。一般是精度要求更高(根据姓名和城市查询一个人比只根据姓名查询一个人精度更高),key_len越长。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CS4ROh7C-1687613436540)(assets/1687613388318-35.png)]

key_len计算规则:https://blog.csdn.net/qq_34930488/article/details/102931490

ref列 表之间的引用

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SGf05tzJ-1687613436540)(assets/1687613388318-36.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4j1S7EUA-1687613436540)(assets/1687613388318-37.png)]

由key_len可知t1表的idx col1 col2被充分使用,cl1匹配t2表的col1,co2匹配了一个常量,即’ac’

rows列 每张表有多少行被优化器查询

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

【没建索引之前】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l56D4a9I-1687613436540)(assets/1687613388318-38.png)]

【建索引之后】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZmRhxs2b-1687613436540)(assets/1687613388318-39.png)]

Extra列 包含不适合在其他列中显示但十分重要的额外信息

Extra列也会有一系列的值,下面是这些值的解释:

  • Using filesort:说明MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作成为"文件内排序"。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XwFIO1Ev-1687613436541)(assets/1687613388318-40.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RdZ59M0c-1687613436541)(assets/1687613388318-41.png)]

总结:出现Using filesort尽快优化

  • Using temporary:使用了临时表(查询结束之后还要删除)保存中间结果,MySQL在対查询结果排序时使用了临时表。常见于排序order by和分组查询group by临时表対系统性能损耗很大。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yvn7VVQm-1687613436541)(assets/1687613388318-42.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u14pwoiT-1687613436542)(assets/1687613388319-43.png)]

总结:出现Using temporary尽快优化

  • Using index:表示相应的SELECT操作中使用了覆盖索引,避免访问了表的数据行,效率不错
  • 如果同时出现Using where,表示索引被用来执行索引键值的查找;
  • 如果没有同时出现Using where,表明索引用来读取数据而非执行查找动作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9F0VgYqd-1687613436542)(assets/1687613388319-44.png)]

覆盖索引:就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。 注意:如果要使用覆盖索引,不要写SELECT *,要写出具体的字段。

  • Using where:表明使用了WHERE过滤。
  • Using join buffer:使用了连接缓存。如果join特别多,可以调大配置文件的buffer。
  • impossible whereWHERE子句的值总是false,不能用来获取任何元组。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P27F933R-1687613436542)(assets/1687613388319-45.png)]

  • select tables optimized away:在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算查询执行计划生成的阶段即完成优化。
  • distinct:找到第一个匹配的元组后停止同样值的动作

EXPLAIN案例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oicf24uw-1687613436543)(assets/1687613388319-46.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9lSr8oxc-1687613436543)(ass![在这里插入图片描述](https://img-blog.csdnimg.cn/f684820b31c24b6098c5444a08fb8565.png)ets/1687613388319-47.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/728113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mali Offline Compiler - 官方视频教学 - 笔录

文章目录 目的Mali Offline Compiler 使用实例视频分析 shadermalioc 命令制定你想要分析的 shader制定你想要分析的着色器对应的 GPU实例解析内容硬件结构 & 驱动 & Shader 类型信息寄存器、是否堆溢出、16-bit 算术占比寄存器的使用量减少浮点精度优化堆溢出与否16-b…

基于Java+vue前后端分离学习交流论坛设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

easyExcel实现动态导出需要的字段列

easyExcel实现动态导出需要的字段列 实体概况 package excel;import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.…

C++学习笔记-第11单元 标准模板库介绍

第11单元 标准模板库介绍 文章目录 第11单元 标准模板库介绍单元导读11.1 标准模板库(STL)基础11.2 STL容器简介11.3 STL迭代器简介11.3.1 使用迭代器访问容器中的元素11.3.2 迭代器类型11.3.3 迭代器支持的运算符操作 11.4 顺序容器11.4.1 顺序容器的逻辑结构11.4.2 代码展示s…

Vue组件库Element-快速入门

目录 什么是Element 快速入门 什么是Element Element&#xff1a;是饿了么团队研发的&#xff0c;一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库组件&#xff1a;组成网页的部件&#xff0c;例如超链接、按钮、图片、表单、表格、分页条等官网&#xff1a;…

avoidLabelOverlap无效果,echarts环形标签重叠,echarts数据重叠

在开发echarts环形图时,会出现数据重叠的现象.比如下面这情况.不可能为了数据将环形图变得太小,这样环形图太小也不美观.后来在官网上查找有一个avoidLabelOverlap属性,结果加上去后也没啥用 解决方法: 除了加上面:avoidLabelOverlap:true以外,还要加另外一个属性:minAngle:1…

win10系统中Pensieve(Sigcomm17)算法部署与运行

win10系统中Pensieve算法部署与运行 一、环境配置1、Anaconda环境配置2、Pycharm安装3、Pensieve安装包配置4、Pensieve数据集生成5、Pensieve代码运行6、Pensieve代码修改 一、环境配置 1、Anaconda环境配置 下载并且安装 Anaconda 官网下载地址&#xff1a;https://www.ana…

【Java基础教程】(六)程序概念篇 · 末:全面讲解Java方法的定义及应用、方法重载及递归~

Java基础教程之程序概念 末 本节学习目标1️⃣ 方法的定义与使用1.1 概念&#x1f50d; 在编写代码时&#xff0c;怎么判断什么情况下应该定义方法? 1.2 方法重载1.3 方法递归 &#x1f33e; 总结 本节学习目标 掌握Java中方法的定义结构、方法重载的概念与应用&#xff1b;…

EulerOS2.0SP10操作系统Esxi虚拟机安装手记

本文记录了在 Esxi7.0平台上新建虚拟机安装华为EulerOS2.0SP10国产操作系统的过程&#xff0c;仅供参考。 一、新建虚拟机 1、在VCenter上选中集群&#xff0c;右键选择新建虚拟机 2、在新建虚拟机视图点NEXT 3、输入虚拟机名称&#xff08;自定义&#xff09;&#xff0c;选…

Apikit 自学日记:如何引用全局变量

引用全局变量 一、什么是全局变量 全局变量可以在测试过程中动态取值以及赋值&#xff0c;比如&#xff1a;使用登录接口获取 token&#xff0c;将 token 值赋值给自定义全局变量 global_token&#xff0c;然后在另一个需要使用该token的接口中&#xff0c;使用 {{global_toke…

css,less,scss中的深度选择器,结合elementUi使用

css中深度选择器用到的是 >>>加类名 可以很方便的找到自己想要修改的样式 lees中用到 /deep/ 加类名 scss中用到::v-deep 加类名

【软件工具使用体验NFC】读取nfc里的内容和写入nfc的内容 tagInfo和TagWritter两款软件的使用和下载

教程目录 教程简介所需环境和版本资源免费下载执行过程tagInfo的使用&#xff1a;tagWritter的使用&#xff1a;my dataset的解释&#xff1a; 结束语 教程简介 这篇内容主要是前段时间开发了一个小程序的时候涉及到了通过小程序读写nfc标签的内容&#xff0c;当时还特地和我们…

特征模型仿真例1:参数辨识

题目 考虑被控对象 G ( s ) 3 s 4 s 4 5 s 3 10 s 2 6 s 4 G(s)\frac{3 s4}{s^{4}5 s^{3}10 s^{2}6 s4} G(s)s45s310s26s43s4​ 和特征模型 y ( k ) ϕ T ( k − 1 ) θ ( k ) y(k)\boldsymbol{\phi}^{\mathrm{T}}(k-1)\boldsymbol{\theta}(k) y(k)ϕT(k−1)θ(k) 其…

谁告诉我这是什么文件,怎么了?活不起了?得靠这个冲业绩?

TIM 从一年前就卸载了&#xff0c;今天整理磁盘才发现还有这么多文件&#xff0c;想着没什么用直接删掉得了&#xff0c;没想到他娘的死活删不掉&#xff0c;好多文件一个一个删才找到这玩意&#xff0c;所有能查找运行程序的地方都找遍了&#xff0c;死活没找到在哪打开了&…

第一章 系统服务监控-SpringBootAdmin

前言 本来想用一节就写完SpringBootAdmin的&#xff0c;但随着研究的深入发现一节应该是不够的&#xff0c;网上的资料也不会非常系统&#xff0c;官网的例子有些已经好几年没更新了&#xff0c;所以接下来还是系统性的来写下吧 第一节 完成基础配置&#xff0c;暴露所有端点…

​如何从任何地方访问办公室电脑?

​远程办公已然成为了一种常见的办公方式&#xff0c;在远程工作期间访问办公室电脑获取必要的文件或信息非常重要。与远程访问同一网络中的电脑不同&#xff0c;使用Windows远程桌面从外部访问办公室电脑需要进行端口转发。对于很多人来说&#xff0c;端口转发可能有点复杂。那…

SpringBoot整合RestTemplate用法讲解(完整详细)

前言&#xff1a;本篇主要介绍了RestTemplate中的GET&#xff0c;POST&#xff0c;PUT&#xff0c;DELETE、文件上传和文件下载6大常用的功能&#xff0c;每一个方法和每一行代码都进行了详细的讲解&#xff0c;代码都是亲自测试过的&#xff0c;整篇博客写完以后自己也是受益匪…

缓存穿透、缓存击穿、缓存雪崩详解以及解决方案

缓存穿透、缓存击穿、缓存雪崩详解以及解决方案 一。缓存穿透 查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都查数据库 方案一&#xff1a; 方案二&#xff1a; 二。缓存击穿 给某一个key设置了过期时间&#xff0…

Mongdb之Robo3T

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;MyBatis详解 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪闪发光的…

2023年PTA行业研究报告

第一章 行业概况 精对苯二甲酸&#xff08;Pure Terephthalic Acid&#xff0c;简称PTA&#xff09;是一种主要用于制造聚酯纤维和塑料的关键化学品。PTA是一种白色结晶固体&#xff0c;可通过对苯二酮在催化剂的作用下进行氧化得到。它是聚对苯二甲酸乙二醇酯&#xff08;PET…