MySql性能优化(三)执行计划详解

news2024/9/25 1:24:24

执行计划

执行计划

  • 执行计划
    • 概述
      • id
      • select_type
      • table
      • type
      • possible_keys
      • key
      • key_len
      • ref
      • rows
      • extra

官网地址
在具体的应用当中,我们排查sql有没有走索引,性能如何,需要查看Sql语句具体的执行过程,以方便我们调整sql来加快sql的执行效率。
可以使用 EXPLAIN + SQL 的语句来模拟优化器执行sql语句,从而知道mysql如何处理sql语句。

概述

执行计划当中包含的信息
在这里插入图片描述

id

select查询的序列号,包含一组数字,表示查询中执行select子句或者操作表的顺序
id 分为三种情况:

1.id 相同
如果id相同,那么执行顺序从上到下

2.id 不同
如果id不同。如果是子查询,id顺序会递增,id大的先执行

2.id 相同和不同的同时存在
相同的认为是同一组,从上往下顺序执行。在所有组中,id值越大,越先被执行

select_type

在这里插入图片描述

simple: 简单的查询,不包含子查询和union

primary:查询中包含任何复杂的子查询,最外层查询被标记为primary

union:若第二个查询出现在union之后,则被标记为union

dependent union:跟union类似,这里的dependent/dependent all 表示union /union all 联合而成的结果会受到外部影响

union result: 从union获取结果的select

subquery: 在select或者where列表当中包含的子查询

dependent subquery:subquery的子查询要受到外部表查询的影响

DERIVED:form子句中出现的子查询,也叫作派生类

UNCACHEABLE SUBQUERY:表示使用子查询的结果不能被缓存

uncachedable union:表示union子查询的结果不能被缓存

table

表示对应行正在访问哪一个表,表名或者别名,可能是临时表或者union合并结果集

1.如果是具体的表名,则表明从实际的物理表当中获取数据,当然也可能是表的别名

2.表名是derivedN的形式,表明使用了id为N的查询产生的衍生表

3.当有union result 的时候,表名是union n1,n2等的形式,n1,n2表示擦浴union的id

type

type显示的是访问类型,访问类型是表示我是以何种方式去访问我们的数据,最容易想到的是全表扫描,直接暴力遍历一张表去寻找需要的数据,效率十分低下,访问类型有很多,效率从好到坏分别有:
system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>ALL
一般情况下,得保证查询达到range范围及其以上

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

2.const:这个表至多一个匹配行
  explain select * from table1 where table_unique_no = "1234***"

3.eq_ref使用唯一索引进行数据查找

  explain select * from table1,table2  where table1.no = table2.no;

4.ref 使用非唯一索引进行数据的查找

  create index idx_1 on table1(no2);
  explain select * from table1,table2 where table1.no2 = table2.no2;

5.ref_or_null  对于某个字段既需要关联条件,也需要null值的情况下,查询优化器会选择这种访问方式

  explain select * from table1 where no is null or no = "xxxx";

6.index_merge:在查询中需要多个索引组合使用

7.unique_subquery:利用索引关联子查询,不在扫描全表,使用的是唯一索引

  explain select * from table1 where  table1.no in (select distinct no from table2 ) ;

8.index_subquery:和unique_subquery 类似,不过使用的不是唯一索引

  explain select * from table1 where  table1.no2 in (select distinct no2 from table2 ) ;

9.range:表示利用索引查询的时候限制了范围,在指定范围内进行查询,这样避免了使用index的全索引扫描,适用操作符有 =, <>, >, >=, <, <=, IS NULL, BETWEEN, LIKE, or IN()

   create index idx_3 on table1(no3); 
   explain  select * from table1 where table1.no3 between 100 and 1000;

10.index:全索引扫描,效率比all好,主要有两种情况,一种当前查询覆盖索引,即我们当前需要的数据在索引中就可以拿到,二是使用了索引进行排序,这样就避免了数据的重排序
   explain select no3 form table1;

11.ALL:全表扫描,一般出现这种且数据量较大的时候就需要优化了
   explain select * from table1

possible_keys

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

key

实际使用的索引,若为null,则没有使用索引,查询中若使用了覆盖索引,则该索引和查询的select字段重叠

key_len

表示索引中使用的字节数,可以通过key_len计算查询中使用的索引长度,在不损失精度的情况下长度越短越好

ref

显示索引哪一列被使用了,如果可能的话,是一个常数

rows

根据表的统计信息及索引的使用情况,大致估算出找出所需记录需要读取的行数,此参数很重要,直接反应的sql查询多少数据,在完成目标的情况下越少越好

extra

包含额外的信息

1.using filesort:说明mysql无法利用索引进行排序,只能利用排序算法进行排序,会消耗额外的位置

2.using temporary:建立临时表来保存中间结果,查询完成之后把临时表删除

3.using index:这个表示当前的查询时覆盖索引的,直接从索引中读取数据,而不用访问数据表。如果同时出现using where 表名索引被用来执行索引键值的查找,如果没有,表面索引被用来读取数据,而不是真的查找

4.using where:使用where进行条件过滤

5.using join buffer:使用连接缓存,情况没有模拟出来

6.impossible where:where语句的结果总是false

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

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

相关文章

如何通过 IntelliJ IDEA 来提升 Java8 Stream 的编码效率

小新再次推荐一篇 &#xff0c;主要是讲如何通过 IntelliJ IDEA 来提升 Stream 的编码效率&#xff0c;算是一个小技巧&#xff0c;经常使用 Java8 Stream 流的小伙伴们&#xff0c;可以试下&#xff0c;能够提升工作效率哦&#xff01; 一、Java8 Stream API 的不友好性 Java…

02优先队列和索引优先队列-优先队列-数据结构和算法(Java)

文章目录1 概述1.1 需求1.2 优先队列特点1.3 优先队列分类1.4 应用场景1.5 相关延伸2 说明3 索引优先队列3.1 实现思路3.2 API设计3.2 代码实现及简单测试5 主要方法讲解5.1 exch()5.2 insert()5.2 poll()6 分析7 后记1 概述 普通的队列是一种先进先出的数据结构&#xff0c;元…

JMeter连接Oracle过程及常见问题总结

如果被测试系统使用的数据库不是MySQL而是Oracle&#xff0c;如何用JMeter进行连接呢&#xff1f; 一、下载数据库驱动 需要确认数据库的版本&#xff0c;可以上网站下载驱动&#xff1a;https://www.oracle.com/database/technologies/jdbc-ucp-122-downloads.html。 或者直…

【Linux】进程间通信-共享内存

前言 我们知道&#xff0c;在Linux中&#xff0c;进程是相互独立存在的&#xff0c;不存在直接让进程之间互相通信的方式。但是如果我们能让不同进程之间见到同一块内存&#xff0c;也就是都能读写这片区域是不是就能够达到进程间通信呢&#xff1f; 事实证明确实如此。在之前我…

【springboot进阶】基于starter项目构建(二)构建starter项目-fastjson

目录 一、创建 fastjson-spring-boot-starter 项目 二、添加 pom 文件依赖 三、构建配置 四、加载自动化配置 五、打包 六、使用 这个系列讲解项目的构建方式&#xff0c;主要使用 父项目 parent 和 自定义 starter 结合。项目使用最新的 springboot3 和 jdk19。本系列的…

kinect v2安装iai_kinect2

目前已完成 前期已经安装了libfreenect2 使用的系统为ubuntu 18.04 使用的相机为kinect v2 已经安装好了orb_slam3&#xff0c;已经完成使用stereo在euroc数据集和使用RGB-D在tum数据集上的测试 目的 想要完成使用深度相机进行在线测试 步骤 step1 经过查阅资料发现目前仅…

大学生HTML期末作业, JavaScript期末大作业

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Java项目:SSM设备台账管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能&#xff1a; 管理员登录,物理设备管理,IP地址资源管理,虚拟机管理,通知公告管理,学历管理,部门管理,员工管理等功能。 …

DFS 数据结构 C++语言实现 图的深度优先遍历

1.DFS图解 图的深度优先遍历 1.1 基本定义&#xff1a; 设初始时&#xff0c;图中所有顶点未曾被访问过&#xff1a; ● 从图中某个顶点 v 出发&#xff0c;访问此顶点&#xff1b; ● 依次从 v 的未被访问的邻接点出发深度优先遍历图&#xff0c;直至图中所有和顶点 v 有路…

【非下载vs解决】error: Microsoft Visual C++ 14.0 or greater is required

首先说解决办法 搜索下载对应库的whl文件即可 下面是解决过程 部分报错为&#xff1a;error: Microsoft Visual C 14.0 or greater is required. Get it with “Microsoft C Build Tools”: https://visualstudio.microsoft.com/visual-cpp-build-tools/ 我是安装wordcloud库…

Activemq安装和控制台

目录 一、安装 二、后台服务启动 三、查看前台 一、安装 http://blog.csdn.net/gebitan505/article/details/55096222 二、后台服务启动 普通启动/关闭 到activemq的目录下执行【./activemq start/stop】进行开启和关闭activemq 带日志的启动 控制台不输出东西&#x…

Stm32旧版库函数2——mpu6050 移植成旧版兼容型库函数DMP

main.c: /******************************************************************************* // 陀螺仪 MPU6050 IIC测试程序 // 使用单片机STM32F103C8T6 // 晶振&#xff1a;8.00M // 编译环境 Keil uVision4 // 在3.3V的供电环境下&#xff0c;就能运行 // 波特率 9600 /…

STM32通过DAC产生正弦波

前言 这一讲主要来讲解DAC功能 文章目录 前言一、DAC简介二、DAC通道框图三、DAC输出电压四、输出正弦波五、代码一、DAC简介 数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位(1…

[机缘参悟-93]:时间、空间、多维度、动态、全局、系统思考模型汇总

目录 前言&#xff1a; 一、空间 - 广度 - 静态 - 多维度模型 1.1 一元太极本源模型 1.2 二元阴阳组合模型 1.3 三元铁三角稳定模型 1.4 四象限优先级模型 1.5 九宫格二维矩阵模型 二、空间 - 高度 - 静态 - 多层次模型 2.1 倒树形层次模型 2.2 金字塔层次结构模型 …

新年新气象:Stimulsoft Designer 2023.1.0 Crack

使用 Stimulsoft Designer&#xff0c;您可以轻松设计从简单列表到多页、具有复杂计算、条件、函数和变量的报告。只需单击几下&#xff0c;您就可以创建易于理解且信息丰富的仪表板、设置过滤器以及对任何元素进行排序。Ω578867473 报表设计器很简单 这是一个不需要编程技能的…

6 转移指令

转移指令 1 数据存储位置的表示 我们定义的描述性符号&#xff1a; reg 和sreg 。使用描述性的符号reg 来表示一个寄存器&#xff0c;用sreg 表示一个段寄存器。 reg 的集合包括&#xff1a; ax 、bx 、ex 、dx 、ah 、al 、bh 、bl 、ch 、cl 、dh 、di 、sp 、bp 、si 、d…

NAT (Network Address Translations) 网络地址转换

数据来源 1、ipv4地址严重不够用了 X.X.X.X X 0-255 A、B、C类可以使用 D组播 E科研 2、IP地址分为公网IP和私网IP 公网IP只能在公网上使用私网IP只能在内网中使用公网上不允许出现私有IP地址私网IP可以重复在内网使用1&#xff09;私有地址范围 10.0.0.0/8&…

Vite+Vue3构建前端框架及模板代码及重要知识点

Vue3Vite构建步骤 用vite初始化vue项目(回车) npm create vitelatest vueVitePro -- --template vue安装配置路由vue-router npm install vue-router4 import router from ./router/index.js createApp(App).use(router).mount(#app) 安装 element-plus 及图标 npm ins…

一个PCA加速技巧

EVD-PCA PCA推导&#xff1a;PCA主成分分析法浅理解 具体数值如1030410304是我机器学习课程实验的数据集参数&#xff0c;这里关注数字量级即可。 code % EVD-PCA数据降维 % input: DN output:KN function [Z, K] EVD_PCA(X, K, weight)fprintf(Running EVD-PCA dimension…

Matplotlib学习笔记(第二章 2.13 Matplotlib中的图形(二))

路径(Paths) 你可以使用matplotlib.path模块在Matplotlib中添加任意路径&#xff1a; Fig. 6: Path Patch 三维绘图(Three-dimensional plotting) mplot3d工具包(参见see Getting started and mplot3d-examples-index))支持简单的3D图形&#xff0c;包括曲面、线框、散点图和…