MySQL:连explain的type类型都没搞清楚,怎敢说精通SQL优化?
我们在使用SQL语句查询表数据时,提前用explain进行语句分析是一个非常好的习惯。通过explain输出sql的详细执行信息,就可以针对性的进行sql优化。
今天我们来分析一下,在explain中11种不同type代表的含义以及其应用场景。
1,system
应用场景:表中只有一条数据,且存储引擎可以准确的统计到这条数据。
system一般出现在MyISAM、memory类型的表查询中。
由于我们一般使用的存储引擎都是InnoDB,所以system这种类型很少会用到。
2,const
应用场景:通过主键或者唯一索引等值查询来定位一条数据。
比如:select * from test where id = 1;
我们知道,MySQL底层使用B+树来保存数据,其结构大体可类似下图,
那么我们在m字段上创建唯一索引约束,如果想找到m=103的记录,通过二分法只需简单两步就可以定位到m=103。
即100->102->103。
即使对于一张记录很多的真正的业务表,因为B+树矮胖的结构,定位一条唯一索引中的记录,速度也是非常快的。
可以粗略的认为,这种查询速度是常数级的。
所以,MySQL就把这种唯一索引或主键(主键也是一种唯一索引)等值匹配的查询定义为const(常数级)。
需要注意的是,由于唯一索引中允许存在多个null值,所以如果对唯一索引进行null值查询,是没法用const的。
3,eq_ref
应用场景:在进行多表连接查询时,被驱动表通过主键或唯一索引键进行等值查询。
比如:SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id;
4,ref
应用场景:普通二级索引等值查询。
比如:select * from t2 where key2 =4;
除了唯一索引,我们更多的会使用普通的二级索引。
由于通过二级索引,可能会查询到多个匹配值,相比const性能差那么一点。
MySQL就把这种类型的查询定义为了ref。
在上面我们说到,由于唯一索引可能存在多个null,所以用不了const。
那对于 select * from t2 where key2 is null 来说,不管是唯一索引还是普通索引,其最多用到ref这种类型。
5,ref_or_null
应用场景:命中索引时,查询条件除了等值查询,还包含null值查询。
比如:select * from t2 where key2 =4 or key2 is null;
其实看名字就很容易理解,MySQL会在B+树上,找到key2=1和key2 is null 这两种记录范围值,然后拿到主键id去回表查询相关信息。
6,index_merge
应用场景:查询条件可以命中多个索引的情况。
比如:select * from t3 where key1 =3 or key2 =4;
索引合并其实也很好理解,当查询条件可以命中多个索引时,MySQL会尝试在两个索引树查找匹配的条件,然后将结果其合并起来。
7,unique_subquery
应用场景:查询条件包含子查询,并且子查询的列可以进行主键等值匹配。
比如:SELECT * FROM t2 WHERE t2.key2 IN ( SELECT id FROM t3 WHERE t2.key2 = t3.key2 ) OR t2.key2 = 1;
通过查看MySQL优化的执行sql,可以看到MySQL将in子查询优化为了exist语句,并且在主键索引上进行了等值查询。
MySQL优化后的语句:/* select#1 */ select dbs
.t2
.id
AS id
,dbs
.t2
.key2
AS key2
from dbs
.t2
where (<in_optimizer>(dbs
.t2
.key2
,(<primary_index_lookup>((dbs
.t2
.key2
) in t3 on PRIMARY where ((dbs
.t2
.key2
= dbs
.t3
.key2
) and ((dbs
.t2
.key2
) = dbs
.t3
.id
))))) or (dbs
.t2
.key2
= 1));
8,index_subquery
应用场景:查询条件包含子查询,并且子查询的列可以通过索引进行等值匹配。
比如:SELECT * FROM t2 WHERE t2.key2 IN ( SELECT key1 FROM t3 WHERE t2.key2 = t3.key2 ) OR t2.key2 = 1;
index_subquery和unique_subquery的区别在于子查询中的列是唯一索引还是普通的二级索引。
9,range
应用场景:命中索引时,查询某一个范围内的结果。
比如:select * from t3 where t3.key1 >1 and t3.key1<3;
在实际的业务场景中,对某个列进行范围查询还是很常见的需求。
10,index
应用场景:直接在某个索引树上做条件判断,并且不需要回表。
比如:select t3.key1 from t3 where t3.key2 =6 ;
当我们创建了联合索引idx_key1_key2(key1,key2)时,判断条件key2=6时,其虽然不满足索引的最左前缀原则,但是我们可以遍历idx_key1_key2这颗索引树,找到key2=6的记录即可。
由于查询结果需要的key1在这个联合索引上,也不需要回表,此时就可以使用index。
相对来说,index的性能是比较慢的。
11,all
应用场景:直接遍历整个聚簇索引。
比如: select * from t1;
当MySQL无法通过where条件匹配到合适的索引或者因为全部扫描的代价更小时,MySQL就会选择all这种类型来全表扫描。
这种方式也是最不推荐的。
最后
总得来说,我们在进行查询时,查询类型可分为两大类:全部扫描和索引查询。
索引查询又可以细分:
1,唯一索引等值查询。
2,普通索引等值查询。
3,普通索引范围查询。
4,扫描整个索引树。
对于一条查询sql来说,不同的查询类型虽然结果可能是一样的,但是其性能却可能天差地别。
不同类型性能从强到差:system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all。
建议大家在平时书写sql时,多用explain进行分析,尝试去优化代码,只有不断的实践,才能让自己的sql能力越来越强。
finally,都看到这里了,点个赞再走吧。
相关文章:
MySQL:连explain的type类型都没搞清楚,怎敢说精通SQL优化?
我们在使用SQL语句查询表数据时,提前用explain进行语句分析是一个非常好的习惯。通过explain输出sql的详细执行信息,就可以针对性的进行sql优化。 今天我们来分析一下,在explain中11种不同type代表的含义以及其应用场景。 1,sys…...
6.11 极分解
文章目录计算方法代码实现计算方法 一个复数可以写成极坐标形式:zreiθzre^{i\theta}zreiθ.这种分解,左边代表长度,右边代表角度。由此为灵感来源,前人对矩阵也有类似的分解。就是猜想一个线性变换对矩阵的作用,是不是可以分解为…...
Spring、SpringMVC、Shiro、Maven
一、SpringSpring是一个为了解决企业应用程序开发复杂性而创建的开源框架,其核心是IOC–控制反转、AOP–面向切面编程。框架的主要优势之一就是其分层架构(WEB层(springMvc)、业务层(Ioc)、持久层ÿ…...
element-plus 使用笔记
npm install element-plus --save自动导入 npm install -D unplugin-vue-components unplugin-auto-import// vite.config.jsimport AutoImport from unplugin-auto-import/vite import Components from unplugin-vue-components/vite import { ElementPlusResolver } from …...
《蓝桥杯每日一题》 前缀和·Acwing 3956. 截断数组
1.题目https://www.acwing.com/problem/content/3959/给定一个长度为 n 的数组a1,a2,…,an。现在,要将该数组从中间截断,得到三个非空子数组。要求,三个子数组内各元素之和都相等。请问,共有多少种不同的截断方法?输入…...
促进关键软件高层次人才培养:平凯星辰与华东师范大学签订联合博士培养合作协议
2022 年年初,平凯星辰入选首批工信部教育部支持联合培养国家关键软件高层次人才计划。该计划旨在探索关键软件产教融合育人模式,超常规加快培养一批急需高层次人才,以及探索关键软件联合技术攻关新模式。2022 年年底,在该计划下 平…...
Java程序员的日常——经验贴
关于文件的解压和压缩 如果你的系统不支持tar -z命令 前往讨论 如果是古老的Unix系统,可能并不认识tar -z命令,因此如果你想要压缩或者解压tar.gz的文件,就需要使用gzip或者gunzip以及tar命令了。 关于tar.gz可以这么理解,tar结…...
电商API社区,商品数据,关键词搜索等
1. 需要做的事情 l 商品详情页实现 1、商品查询服务事项 2、商品详情展示 3、添加缓存 2. 实现商品详情页功能 2.1. 功能分析 1、Taotao-portal接收页面请求,接收到商品id。 2、调用taotao-rest提供的商品详情的服务,把商品id作为参数传递给服务。接…...
LEADTOOLS 22.0.6 UPDATE-Crack
OCR SDK 库 许多 OCR 增强功能 LEAD 行业领先的人工智能 OCR SDK 在以下方面获得了显着的识别优化:斜体、大写和小写字母、文本行组装和单词构建、列检测、基线检测和文本行分割。 LEADTOOLS为.NET 6、. NET Framework、Xamarin、UWP、C#、VB、C/C、Java、Objective…...
什么是OJ? 东方博宜题库部分题解
什么是OJ ? Online Judge 比如这样的:Home - 一本通OJ Q:这个在线裁判系统使用什么样的编译器和编译选项? A:系统运行于Debian/Ubuntu Linux. 使用GNU GCC/G++ 作为C/C++编译器, C: gcc Main.c -o Main -fno-asm -O2 -Wall -lm --static -std=c99 -DONLINE_JUDGE C++: g++ …...
企业工程项目管理系统源码的各模块及其功能点清单
工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…...
【电商开发手册】订单-下单
下单需求 所谓下单,本质上就是买卖双方通过确认一系列信息并且签订电子合同的过程 在电商平台的下单过程中,也需要确定买卖双方的一系列信息: 买方:用户确认收货地址、支付方式、配送方式等等 卖方:卖方需要进行供…...
数据结构 - 优先级队列(堆)
文章目录前言1.介绍优先级队列2. 认识堆3. 实现优先级队列3.1 了解优先级队列的构造方法:3.2 使用优先级队列解决问题:总结前言 本篇PriorityQueue优先级队列的介绍其底层是堆,关于堆的认识,使用优先级队列能解决的一些问题&…...
PDF内容提取器:ByteScout PDF Extractor SDK Crack
ByteScout PDF Extractor SDK – 用于 PDF 到 JSON、PDF 到 Excel、CSV、XML、从 .NET 和 ASP.NET 从 PDF 中提取文本的 PDF 提取器库 ByteScout PDF Extractor SDK – 用于 PDF 到 JSON、PDF 到 Excel、CSV、XML、从 .NET 和 ASP.NET 从 PDF 中提取文本的 PDF 提取器库 …...
字母板上的路径[提取公共代码,提高复用率]
提取公共代码前言一、字母版上的路径二、贪心1、idea2、go3、代码不断拆分复用的过程总结参考文献前言 写代码,在提高效率的同时,要方便人看,这个人包括自己。大函数要拆分成一些小函数,让每个函数的宏观目的和步骤都显得清晰&am…...
c# winform错误大全
c# winform 错误大全为了实现安装包安装完成后,启动程序。System.BadImageFormatException: 未能加载文件或程序集“file:///C:\xxxxxxxxx\xxxxxxx.exe”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程The version of the …...
AI_News周刊:第一期
2023.02.06—2023.02.12 关于ChatGPT的前言: 在去年年末,OpenAI的ChatGPT在技术圈已经火了一次,随着上周它的二次出圈,ChatGPT算得上是人工智能领域的一颗明星,它在聊天机器人领域有着不可忽视的影响力。其准确、快速…...
搭建mysql主从复制
前言: 👏 作者简介:我是笑霸final,一名热爱技术的在校学生。 📝 个人主页:个人主页1 || 笑霸final的主页2 📕 系列专栏:数据库 📧 如果文章知识点有错误的地方࿰…...
内存溢出、内存泄露的概述及常见情形
内存溢出(OutofMemoryError) 简述 java doc 中对 Out Of Memory Error 的解释是,没有空闲内存,并且垃圾收集器也无法提供更多内存。 JVM 提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理,由于 GC&…...
Linux 中断实验
目录 一、Linux 中断简介 上半部与下半部 二、添加设备树 三、编写驱动 1、定义宏 2、编写一个key结构体 3、imx6uirq设备添加成员 编辑4、按键中断处理函数 5、按键初始化 6、在驱动入口添加初始化 7、 驱动出口函数 代码如下 四、利用定时器进行消抖处理 1、添…...
【c++】指针
文章目录指针的定义和使用指针所占的内存空间空指针野指针const修饰指针指针和数组指针和函数指针、数组、函数案例:冒泡排序指针的定义和使用 指针定义的语法:数据类型 * 指针变量名 使用指针: 可以通过解引用的方式来找到指针指向的内存&…...
别具一格的婚礼,VR全景+婚礼的优势展现在哪里?
随着90后、95后逐渐步入结婚的主力军中,如何策划一场别具一格的婚礼是许多年轻人所头疼的,那么今年我们就可以玩点新潮的,VR婚礼或许是个不错的选择。 VR全景婚礼就是通过全景摄像机对婚礼进行记录,不但可以帮助新人捕捉婚礼的精彩…...
【GD32F427开发板试用】5. SPI驱动TFTLCD屏幕
本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:hehung 之前发帖 【GD32F427开发板试用】1. 串口实现scanf输入控制LED 【GD32F427开发板试用】2. RT-Thread标准版移植 【GD32F427开发板试用…...
测试2年还拿实习生的薪资打发我,你后悔去吧····
20年7月大学毕业,学的计算机科学专业。因为考研之后,秋招结束了。没什么更多的岗位选择,就想找个工作先干着,然后亲戚在一家大厂公司上班说要招测试,所以就来做测试了。 虽然都是属于计算机大类,但自己专业…...
面向对象程序(C++)设计基础
一、类&对象C 在 C 语言的基础上增加了面向对象编程,C 支持面向对象程序设计。类是 C 的核心特性,通常被称为用户定义的类型。类提供了对象的蓝图,所以基本上,对象是根据类来创建的。声明类的对象,就像声明基本类型…...
conda安装nodejs版本过低解决方法
conda命令直接安装nodejs时,可能会由于镜像源中nodejs版本过低导致没法安装高本版的nodejs,导致无法jupyterlab使用一些扩展插件。 解决方法如下:(windows环境下直接按提示下载版本安装就行,此处只介绍linux环境的解决…...
前端工程师leetcode算法面试必备-二分搜索算法(下)索算法(下)
一、287. 寻找重复数 给定一个包含 n 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。 1、HashMap 在没有其它附加条件的情况下&…...
使用Autowired为什么会被IDEA警告,应该怎么修改最佳
问题原因 关于这个问题,其实答案相对统一,实际上用大白话说起来也容易理解。 初始化问题 先看一下Java初始化类的顺序:父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块 &…...
面向对象(中)
面向对象(中) 一、 面向对象之继承性 继承性的好处 减少代码的冗余,提高了代码的复用性。 便于功能的扩展。 为多态性的使用,提供了前提。 继承性的格式 class A extends B{} A:子类、派生类、subclass B:…...
【云原生】promehtheus整合grafana实现可视化监控实战
文章目录前言一. 实验环境二. 安装grafana2.1 grafana的介绍2.2 为什么选择grafana?2.3 grafana下载及安装三. 网页端配置grafana3.1 浏览器访问grafana网页3.2 使用grafana 获取prometheus的数据源3.3 grafana导入prometheus模板总结前言 大家好,又见面…...
微网站价格/网络营销方式与工具有哪些
一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿的时候,才试图拿起左、 右两根筷子࿰…...
艺术网站定制/人民日报今日头条新闻
PCB线间距设多少好?过孔的大小与线宽有没有固定关系?走线的Via孔附近加接地Via孔的作用及原理一般加工能力:line:4milgap:4milvia:10mil/24mil最好:line:>8milgap:>8milvia:>12mil/25mil在走线的Via孔附近加接地Via孔的作用及原理是什么&#x…...
二维码怎么在网站上做推广/最佳搜索引擎磁力王
Ext2:Ext2是GNU/Linux系统中标准的文件系统。这是Linux中使用最多的一种文件系统,它是专门为Linux设计的,拥有极快的速度和极小的CPU占用率。Ext2既可以用于标准的块设备(如硬盘),也被应用在软盘等移动存储设备上。Ext3࿱…...
上海企业专属网站建设平台/佛山疫情最新消息
1、静态调用 (编译进程序,程序启动后,会一直占用内存,直到程序退出后,才会释放) [System.Runtime.InteropServices.DllImport(".\\NiuTuAllDll\\NiuTuNetCameraDll.dll", CallingConvention Sys…...
商业计划书模板/东莞seo网站优化排名
squidhttp://www.squid-cache.org/squid软件主要有两大应用:1,代理上网(正向代理,透明代理)2,网站静态页面缓存加速(反向代理)三种代理类型正向代理 代理内部主机上网,共享上网,缓存,控制内网用户上网行为等功能&#…...
邢台网站制作多少钱/怎么投放广告是最有效的
用控制台输入,成绩是整数,控制台只有字符串和整数型, 字符串: java.util.Scanner s new java.util.Scanner(System.in); String score s.next(); 整数: java.util.Scanner s new java.util.Scanner(System.in); int…...