当前位置: 首页 > news >正文

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语句查询表数据时&#xff0c;提前用explain进行语句分析是一个非常好的习惯。通过explain输出sql的详细执行信息&#xff0c;就可以针对性的进行sql优化。 今天我们来分析一下&#xff0c;在explain中11种不同type代表的含义以及其应用场景。 1&#xff0c;sys…...

6.11 极分解

文章目录计算方法代码实现计算方法 一个复数可以写成极坐标形式:zreiθzre^{i\theta}zreiθ.这种分解&#xff0c;左边代表长度&#xff0c;右边代表角度。由此为灵感来源&#xff0c;前人对矩阵也有类似的分解。就是猜想一个线性变换对矩阵的作用&#xff0c;是不是可以分解为…...

Spring、SpringMVC、Shiro、Maven

一、SpringSpring是一个为了解决企业应用程序开发复杂性而创建的开源框架&#xff0c;其核心是IOC–控制反转、AOP–面向切面编程。框架的主要优势之一就是其分层架构&#xff08;WEB层&#xff08;springMvc&#xff09;、业务层&#xff08;Ioc&#xff09;、持久层&#xff…...

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。现在&#xff0c;要将该数组从中间截断&#xff0c;得到三个非空子数组。要求&#xff0c;三个子数组内各元素之和都相等。请问&#xff0c;共有多少种不同的截断方法&#xff1f;输入…...

促进关键软件高层次人才培养:平凯星辰与华东师范大学签订联合博士培养合作协议

2022 年年初&#xff0c;平凯星辰入选首批工信部教育部支持联合培养国家关键软件高层次人才计划。该计划旨在探索关键软件产教融合育人模式&#xff0c;超常规加快培养一批急需高层次人才&#xff0c;以及探索关键软件联合技术攻关新模式。2022 年年底&#xff0c;在该计划下 平…...

Java程序员的日常——经验贴

关于文件的解压和压缩 如果你的系统不支持tar -z命令 前往讨论 如果是古老的Unix系统&#xff0c;可能并不认识tar -z命令&#xff0c;因此如果你想要压缩或者解压tar.gz的文件&#xff0c;就需要使用gzip或者gunzip以及tar命令了。 关于tar.gz可以这么理解&#xff0c;tar结…...

电商API社区,商品数据,关键词搜索等

1. 需要做的事情 l 商品详情页实现 1、商品查询服务事项 2、商品详情展示 3、添加缓存 2. 实现商品详情页功能 2.1. 功能分析 1、Taotao-portal接收页面请求&#xff0c;接收到商品id。 2、调用taotao-rest提供的商品详情的服务&#xff0c;把商品id作为参数传递给服务。接…...

LEADTOOLS 22.0.6 UPDATE-Crack

OCR SDK 库 许多 OCR 增强功能 LEAD 行业领先的人工智能 OCR SDK 在以下方面获得了显着的识别优化&#xff1a;斜体、大写和小写字母、文本行组装和单词构建、列检测、基线检测和文本行分割。 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、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…...

【电商开发手册】订单-下单

下单需求 所谓下单&#xff0c;本质上就是买卖双方通过确认一系列信息并且签订电子合同的过程 在电商平台的下单过程中&#xff0c;也需要确定买卖双方的一系列信息&#xff1a; 买方&#xff1a;用户确认收货地址、支付方式、配送方式等等 卖方&#xff1a;卖方需要进行供…...

数据结构 - 优先级队列(堆)

文章目录前言1.介绍优先级队列2. 认识堆3. 实现优先级队列3.1 了解优先级队列的构造方法&#xff1a;3.2 使用优先级队列解决问题&#xff1a;总结前言 本篇PriorityQueue优先级队列的介绍其底层是堆&#xff0c;关于堆的认识&#xff0c;使用优先级队列能解决的一些问题&…...

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、代码不断拆分复用的过程总结参考文献前言 写代码&#xff0c;在提高效率的同时&#xff0c;要方便人看&#xff0c;这个人包括自己。大函数要拆分成一些小函数&#xff0c;让每个函数的宏观目的和步骤都显得清晰&am…...

c# winform错误大全

c# winform 错误大全为了实现安装包安装完成后&#xff0c;启动程序。System.BadImageFormatException: 未能加载文件或程序集“file:///C:\xxxxxxxxx\xxxxxxx.exe”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新&#xff0c;无法加载此程The version of the …...

AI_News周刊:第一期

2023.02.06—2023.02.12 关于ChatGPT的前言&#xff1a; 在去年年末&#xff0c;OpenAI的ChatGPT在技术圈已经火了一次&#xff0c;随着上周它的二次出圈&#xff0c;ChatGPT算得上是人工智能领域的一颗明星&#xff0c;它在聊天机器人领域有着不可忽视的影响力。其准确、快速…...

搭建mysql主从复制

前言&#xff1a; &#x1f44f; 作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd; 个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5; 系列专栏&#xff1a;数据库 &#x1f4e7; 如果文章知识点有错误的地方&#xff0…...

内存溢出、内存泄露的概述及常见情形

内存溢出&#xff08;OutofMemoryError&#xff09; 简述 java doc 中对 Out Of Memory Error 的解释是&#xff0c;没有空闲内存&#xff0c;并且垃圾收集器也无法提供更多内存。 JVM 提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理&#xff0c;由于 GC&…...

Linux 中断实验

目录 一、Linux 中断简介 上半部与下半部 二、添加设备树 三、编写驱动 1、定义宏 2、编写一个key结构体 3、imx6uirq设备添加成员 ​编辑4、按键中断处理函数 5、按键初始化 6、在驱动入口添加初始化 7、 驱动出口函数 代码如下 四、利用定时器进行消抖处理 1、添…...

云原生数据库的设计与实践:从架构到部署

云原生数据库的设计与实践&#xff1a;从架构到部署 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农&#xff0c;我深知云原生技术对数据库的影响。随着云计算的快速发展&#xff0c;云原生数据库已经成为数据库技术的重要发展方向。今天&#xff0c;我就来聊聊云原生数据库…...

【深度解析】Hermes Agent:具备学习循环的开源 AI 代理如何落地到你的开发工作流?

摘要 Hermes Agent 是 News Research 推出的开源 AI Agent 系统&#xff0c;不只是“聊天包装器”&#xff0c;而是带有持久化记忆、自我技能学习与多通道接入的完整代理运行环境。本文从架构原理到落地实践&#xff0c;系统解析 Hermes 的学习循环、模型接入方式&#xff08;云…...

告别OBS!用JavaCV+FFmpeg在Windows上搭建个人直播推流服务器(含Nginx配置)

用JavaCVFFmpeg构建Windows直播推流服务器的全栈指南 直播技术正在从专业领域向个人开发者渗透&#xff0c;但传统方案如OBS往往过于笨重且缺乏定制性。本文将带你用JavaCVFFmpegNginx搭建一套轻量级直播推流服务器&#xff0c;实现从视频采集、编码推流到服务端分发的完整链路…...

2026 年1月 13 日-KB5074109(OS内部版本 26200.7623 和 26100.7623)

&#x1f525;个人主页&#xff1a;杨利杰YJlio❄️个人专栏&#xff1a;《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》&#x1f31f; 让复杂的事情更…...

脉冲注入法与电感法无刷电机BLDC控制器方案

脉冲注入法&#xff0c;持续注入&#xff0c;启动低速运行过程中注入&#xff0c;电感法&#xff0c;ipd&#xff0c;力矩保持&#xff0c;无霍尔无感方案&#xff0c;媲美有霍尔效果。 bldc控制器方案&#xff0c;无刷电机。 提供源码&#xff0c;原理图。一、文档引言 本文基…...

分数阶效应下饱和非线性介质中艾里高斯光束传输仿真代码功能说明

Matlab光场调控的仿真代码&#xff08;全套复现论文&#xff09; 之前本科搞大创发了篇文章&#xff0c;纯搞光场调控的仿真&#xff0c;后来读研不做这个方向了&#xff0c;寻思卖了 Tips&#xff1a;本科生毕设&#xff0c;研究生搞理论的&#xff0c;领域为非线性光学的、光…...

5大核心功能深度解析:AltDrag如何重新定义Windows窗口管理效率

5大核心功能深度解析&#xff1a;AltDrag如何重新定义Windows窗口管理效率 【免费下载链接】altdrag :file_folder: Easily drag windows when pressing the alt key. (Windows) 项目地址: https://gitcode.com/gh_mirrors/al/altdrag 在Windows系统中&#xff0c;窗口管…...

终极跨平台资源下载器:如何一键获取视频号、抖音无水印内容

终极跨平台资源下载器&#xff1a;如何一键获取视频号、抖音无水印内容 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否…...

LeetCode-001:Python 实现哈希表求两数之和:初识哈希表

一、先说这道题在问什么 “两数之和”是 LeetCode 里非常经典的一道入门题。 题目大意是&#xff1a; 给你一个整数数组 nums 和一个目标值 target&#xff0c;请你在数组中找到 两个数&#xff0c;让它们相加等于 target&#xff0c;并返回这两个数的下标。 比如&#xff…...

OneNote转Markdown全流程工具:高效迁移与备份解决方案

OneNote转Markdown全流程工具&#xff1a;高效迁移与备份解决方案 【免费下载链接】onenote-md-exporter ConsoleApp to export OneNote notebooks to Markdown formats 项目地址: https://gitcode.com/gh_mirrors/on/onenote-md-exporter OneNote导出Markdown格式的需求…...