MySQL篇—执行计划之覆盖索引Using index和条件过滤Using where介绍(第三篇,总共三篇)
☘️博主介绍☘️:
✨又是一天没白过,我是奈斯,DBA一名✨
✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️
❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣️❣️❣️
SQL语句的执行计划复杂多变,每一次的查询都可能带来截然不同的执行策略。为了真正掌握其内在的工作机制,我们必须深入生产环境,通过反复的实践与观察来积累经验。今天将聚焦于explain Extra
输出列中的两个关键要素:“Using index”和“Using where”,带大家一起看一下Using index和Using where对查询计划的影响,当然今天的介绍只是众多Extra
输出列中其中的两个。希望通过这篇文章,能够帮助大家更好地理解SQL查询的执行过程,以及如何更有效地优化查询性能。
今天作为统计信息和执行计划的最后一篇,让我们回顾一下前两篇的介绍内容:
第一篇:持久化和非持久化统计信息介绍
第二篇:执行计划介绍
第三篇:执行计划之覆盖索引Using index和条件过滤Using where详细介绍(当前篇)
目录
一、Using index:使用覆盖索引。属于积极现象,一般不需要过多再去干预。
案例:不使用覆盖索引的情况和使用覆盖索引的情况
不使用覆盖索引的情况:
使用覆盖索引的情况:
二、Using where:条件中的字段没有使用索引,或者部分字段没有使用索引。属于消极现象,进行分析干预。
案例:使用到Using where的情况和不使用到Using where的情况
使用到Using where的情况:
不使用到Using where的情况:
一、Using index:使用覆盖索引。属于积极现象,一般不需要过多再去干预。
注意:是使用了覆盖索引,和使用索引不是一个概念,有没有使用索引通过key输出列确定。
官方文档介绍:MySQL :: MySQL 8.0 Reference Manual :: 10.8.2 EXPLAIN Output Format
使用索引(JSON属性:Using_index)
只使用索引树中的信息从表中检索列信息,而不必进行额外的查找来读取实际行。当查询仅使用作为单个索引一部分的列时,可以使用此策略。
对于具有用户定义的聚集索引的InnoDB表,即使Extra列中没有Using索引,也可以使用该索引。如果类型为索引,键为PRIMARY,则会出现这种情况。
显示了EXPLAIN FORMAT=TRADINAL和EXPLAIN ORMAT=JSON所使用的任何覆盖索引的信息。从MySQL 8.0.27开始,它也显示为EXPLAIN FORMAT=TREE。
覆盖索引(Covering Index):
如果一个索引包含了查询所需的所有字段,则称该索引为覆盖索引。当MySQL查询使用这个索引时,它可以直接从索引中获取所有需要的数据,而无需再回表(即返回原表)查找。
在查询执行计划中,当出现“Using index”时,意味着MySQL已经使用了覆盖索引(Covering Index)来检索数据。这是一个优化提示,表明查询可以仅通过索引来满足,而无需访问实际的数据表。
出现覆盖索引的好处:1、减少I/O操作:因为MySQL可以仅通过索引获取数据,所以它不需要读取整个表的数据,这通常意味着更少的磁盘I/O操作。
2、提高查询速度:由于减少了I/O操作和可能的表查找,查询通常会更快。
3、减少内存使用:由于不需要从表中读取额外的数据,所以内存使用可能会更低。
需要注意的是,虽然“Using index”是一个优化提示,但在某些情况下,它可能不是最优的。例如,如果查询中的某些条件不能有效地使用索引,或者索引本身非常大,那么全表扫描可能更快。
回表(Back to Table):
"回表"是指当查询语句需要获取的数据不仅仅在索引中,还需要回到主表中进行二次查询获取的过程。
1、回表的影响:回表操作会增加额外的I/O操作和访问时间,影响查询的性能。因为回表需要额外的查找步骤,所以在高并发的情况下,回表操作会导致数据库的负载增加,可能会成为性能瓶颈。
2、如何避免回表:为了避免回表操作,可以使用覆盖索引(Covering Index)的方式。覆盖索引是指创建一个包含了查询所需的所有列的索引,这样就可以直接从索引中获取所需的数据,而无需回到表中查找。使用覆盖索引可以减少I/O操作和提高查询性能。
3、如何优化回表:如果无法避免回表操作,可以通过以下方法进行优化:
一、优化查询语句:尽量减少回表操作的次数,可以通过合理的查询条件、索引设计和查询优化等方式来减少回表操作。
二、调整表结构:如果回表操作非常频繁,可以考虑调整表结构,将需要查询的列放在索引中,或者使用聚簇索引来减少回表操作。
三、使用缓存:如果查询的数据具有一定的重复性,可以考虑使用缓存来减少回表操作。
覆盖索引触发的条件:
1、没有where条件,select查询的返回列包含在索引列中:这意味着查询的结果可以直接从索引中获取,而无需访问实际的数据表。
2、有where条件,where和select都要包含索引列或复合索引:这有助于数据库系统更有效地利用索引进行查找和过滤。
3、查询结果的总字段长度可以接受:如果查询结果的总字段长度过大,可能不适合使用覆盖索引,因为这可能会增加系统的开销。
当满足上述条件时,数据库系统可能会选择使用覆盖索引来执行查询,从而提高查询的效率。不过,请注意,索引的使用和优化是一个复杂的过程,具体是否使用覆盖索引还取决于数据库管理系统的具体实现和查询的具体情况。
案例:不使用覆盖索引的情况和使用覆盖索引的情况
mysql> show index from tb_200w; ---表现在无索引
mysql> create index idx_tb_200w_ina on tb_200w(id,name,age); ---创建索引
不使用覆盖索引的情况:
1)没有where条件,select查询的返回列没有在索引列中:
mysql> explain select * from tb_200w; mysql> explain select sex from tb_200w; mysql> explain select age,sex from tb_200w; ---select中包含了索引列和没有索引的列,这种情况肯定是不会使用到覆盖索引的,因为查询语句需要获取的数据不仅仅在索引中,还需要回到主表中进行二次查询获取的过程。
2)有where条件,where或select没有包含索引列或复合索引:
mysql> explain select * from tb_200w where id=1; mysql> explain select sex from tb_200w where id=1; mysql> explain select age,sex from tb_200w where id=1; ---where包含了索引列,但是select中包含了索引列和没有索引的列,这种情况肯定是不会使用到覆盖索引的,因为查询语句需要获取的数据不仅仅在索引中,还需要回到主表中进行二次查询获取的过程。
使用覆盖索引的情况:
1)没有where条件,select查询的返回列包含在索引列中:
mysql> explain select id from tb_200w; mysql> explain select name from tb_200w; mysql> explain select age from tb_200w; mysql> explain select name,age from tb_200w; mysql> explain select age,id from tb_200w; ---都会使用到覆盖索引,因为select查询的返回列包含在索引列中了
2)有where条件,where和select都要包含索引列或复合索引:
mysql> explain select id from tb_200w where id=1; mysql> explain select name from tb_200w where id=1; mysql> explain select age from tb_200w where id=1; mysql> explain select name,age from tb_200w where id=1; mysql> explain select age,id from tb_200w where id=1; ---都会使用到覆盖索引,因为where和select都包含索引列或复合索引了
二、Using where:条件中的字段没有使用索引,或者部分字段没有使用索引。属于消极现象,进行分析干预。
官方文档介绍:MySQL :: MySQL 8.0 Reference Manual :: 10.8.2 EXPLAIN Output Format
使用where(JSON属性:attached_condition)
WHERE子句用于限制哪些行与下一个表匹配或发送到客户端。除非您特别打算从表中提取或检查所有行,否则如果Extra值不是Using where,并且表联接类型是all或index,则查询中可能会出现错误。
Using where介绍:
Using where表示查询在检索到行之后,需要使用WHERE子句中的条件对这些行进行过滤。这并不一定意味着查询没有使用索引,而是意味着即使有索引被使用,索引本身并不能完全满足WHERE子句中的所有条件,因此MySQL需要读取实际的行数据,并在服务器层面对这些行进行额外的过滤。
Using where触发的条件:
1、复合索引与部分条件匹配:如果你有一个复合索引(例如 (a, b, c)),但你的WHERE子句只涉及索引的前两个字段(例如 WHERE a = 1 AND b = 2),那么MySQL可以使用这个复合索引来快速找到匹配的行。但是,如果WHERE子句还包含第三个字段的条件(例如 c > 3),则即使索引被使用,Using where 也会出现在执行计划中,因为需要对找到的行进行额外的过滤。
2、没有合适的索引:如果查询的WHERE子句条件没有对应的索引,或者索引的选择性不高(即索引中的不同值不多),MySQL可能会选择全表扫描而不是使用索引。在这种情况下,Using where 会出现在执行计划中,因为所有检索到的行都需要进行过滤。
避免Using where的触发:
Using where 的出现并不一定意味着查询性能不佳。实际上,在很多情况下,即使需要额外的过滤,使用索引仍然比全表扫描更快。然而,如果发现Using where经常出现并且查询性能不佳,需要考虑:
1、添加或优化索引:确保你的查询条件有合适的索引支持。
2、调整查询:尝试重写查询或分解复杂查询为多个简单查询,以便更好地利用索引。
3、分析数据和索引统计信息:使用ANALYZE TABLE命令更新表的统计信息,以便MySQL优化器能够做出更好的决策。
案例:使用到Using where的情况和不使用到Using where的情况
mysql> show index from tb_200w; ---表现在无索引
mysql> create index idx_tb_200w_id on tb_200w(id); ---创建单列索引 mysql> create index idx_tb_200w_ina on tb_200w(name,age,cardid); ---创建复合索引
使用到Using where的情况:
mysql> explain select * from tb_200w where tel=13604981449; ---直接查询普通列,而不引用索引列 mysql> explain select * from tb_200w where age=38; ---查询的列在复合索引中,但是并没有引用前置列(name列),所以不会使用到索引 mysql> explain select * from tb_200w where cardid=1000110123; ---查询的列在复合索引中,但是并没有引用前置列(name列),所以不会使用到索引
不使用到Using where的情况:
mysql> explain select * from tb_200w where id=1000; ---使用单列索引 mysql> explain select * from tb_200w where name='n1000'; ---使用复合索引,引用了前置列(name列) mysql> explain select * from tb_200w where name='n1000' and age=38 and cardid='1000110123'; ---使用复合索引,引用了前置列(name列)
关于统计信息和执行计划的内容全部就到这里,执行计划所涉及的内容太过广泛,我所介绍的内容也只是冰山一角,以后就靠大家自己去学习和实践。当然我也会继续在CSDN上分享关于执行计划的内容。
相关文章:

MySQL篇—执行计划之覆盖索引Using index和条件过滤Using where介绍(第三篇,总共三篇)
☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣…...

最短路径(2.19)
目录 1.网络延迟时间 弗洛伊德算法 迪杰斯特拉算法 2. K 站中转内最便宜的航班 3.从第一个节点出发到最后一个节点的受限路径数 4.到达目的地的方案数 1.网络延迟时间 有 n 个网络节点,标记为 1 到 n。 给你一个列表 times,表示信号经过 有向 边的…...

vue 总结
1.vue 的生命周期 1. es6 2. vue 基本属性指令 <template><div><!--<h1>vue基本指令的使用方式</h1><a :href"url">v-bind使用链接</a><img :src"srcUrl" /><div>解决闪烁问题<p v-cloak>{{…...

深入理解TCP/IP协议:互联网通信的核心
深入理解TCP/IP协议:互联网通信的核心 在数字化时代,TCP/IP协议是支撑全球互联网通信的基石。它不仅负责数据的传输和路由,还确保了信息传递的准确性和完整性。本文将深入探讨TCP/IP协议的工作原理、结构以及它在网络编程中的应用。 TCP/IP…...

Python数据处理实战(4)-上万行log数据提取并作图进阶版
系列文章: 0、基本常用功能及其操作 1,20G文件,分类,放入不同文件,每个单独处理 2,数据的归类并处理 3,txt文件指定的数据处理并可视化作图 4,上万行log数据提取并作图进阶版&a…...

JavaWeb Tomcat启动、部署、配置、集成IDEA
web服务器软件 服务器是安装了服务器软件的计算机,在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目。 Web服务器是一个应用程序(软件),对HTTP协议的操作进行封装,使得程序…...

关于Vue3的一些操作
1. 设置浏览器自动打开 在package.json 中设置 dev: vite --open 2.给src文件夹配置别名 在vite.config.ts配置文件中添加以下内容 3. 如果2中有红色波浪线的问题 ***安装一个文件包***npm install types/node3. 在tsconfig.json配置文件中,找到配置项compi…...

外贸常用的出口认证 | 全球外贸数据服务平台 | 箱讯科技
出口认证是一种贸易信任背书,对许多外贸从业者而言,产品的出口认证和当前的国际贸易环境一样复杂多变,不同的目标市场、不同的产品类别,所需要的认证及标准也不同。 国际认证 01 IECEE-CB IECEE-CB体系的中文含义是“关于电工产品测试证书的相互认可体…...

C++ 标准库类型string
C/C总述:Study C/C-CSDN博客 目录 定义和初始化string对象 string的增 使用push_back进行尾插 使用insert插入 使用append函数完成string的拼接 string的删 使用pop_back进行尾删 使用erase删除 string的查 使用find函数正向搜索第一个匹配项 使用rf…...

Material UI 5 学习02-其它按钮组件
Material UI 5 学习02-其它按钮组件 一、IconButton按钮二、 ButtonGroup按钮组1、最基本的实例2、垂直按钮组 一、IconButton按钮 图标按钮通常适用于切换按钮,允许选择或选择单个选项 取消选择,例如在项目中添加或删除星号。 <IconButton aria-lab…...

Express学习(三)
Express中间件 中间件的概念 什么是中间件 中间件,特指业务流程的中间处理环节。Express中间件的调用流程 当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理。类似于下图所示 Express中间件的格式 Expr…...

influxdb2.0插入数据字段类型出现冲突问题解决
一、问题出现 一个学校换热站自控系统,会定时从换热站获取测点数据,并插入到influxdb数据库中。influxdb插入数据时,报错提示: com.influxdb.exceptions.UnprocessableEntityException: failure writing points to database: par…...

[C++]类和对象,explicit,static,友元,构造函数——喵喵要吃C嘎嘎4
希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…...

物联网的商业模式洞察
大约在十年前(2014年11月),全球知名管理思想家、哈佛商学院教授迈克尔波特与PTC前首席执行官吉姆赫普尔曼,在《哈佛商业评论》上联合撰写了一篇备受赞誉的文章,题为《智能互联产品如何改变竞争》。在这篇文章中&#x…...

智能指针基础知识【C++】【RAII思想 || unique_ptr || shared_ptrweak_ptr || 循环引用问题】
目录 一,为什么需要智能指针 二,内存泄露的基本认识 1. 内存泄露分类 2. 常见的内存检测工具 3,如何避免内存泄露 三,智能指针的使用与原理 1. RAII思想 2. 智能指针 (1. unique_ptr (2. shared_…...

leetcode:反转链表II 和k个一组反转链表的C++实现
反转链表II 问题描述 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left < right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 ListNode* reverseBetween(ListNode* head, int left, int right) {ListNode *…...

ERD Online 快速启动指南:代码下载到首次运行的全流程攻略 ️
🚀 一、代码下载 ERD online前端代码正常拉取即可👌 后端代码含有子模块,拉取命令如下: git clone --recurse-submodules https://github.com/www-zerocode-net-cn/martin-framework.git 🛠️ 二、代码构建 dz…...

c++ 11 新特性 不同数据类型之间转换函数之const_cast
一.不同数据类型之间转换函数const_cast介绍 const_cast是C11中引入的一种类型转换操作符,用于修改类型的const或volatile属性。const_cast的主要用途是移除对象的常量性,它是唯一具有此能力的C风格的转型操作符。在C11中,const_cast可以完成…...

C++从零开始的打怪升级之路(day45)
这是关于一个普通双非本科大一学生的C的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天分享的是关于二叉树的题目 1.根据二叉树创建字符串 606. 根…...

小鹅通前端实习一面
总时长35分钟,自我介绍开始 1.js和c特点上的差异; 2.js数组去重 3.js的数据类型 4.js的引用类型和值类型的差别 5.讲一下js的网络请求 6.对前端三件套和框架的理解 7.一个html文档的结构是怎样的 8.head和body的区别 9.一个页面的加载顺序(ht…...

ArrayList常用API
常见方法 add 增remove 删set 改get 查clear 清空元素size 长度isEmpty 为空判断 用法 // String就是泛型 这种使用方法对于限制类型很有用 ArrayList<String> arrayList new ArrayList<>();// add 添加元素 返回的是boolean 代表是否添加成功 arrayList.add(&qu…...

Chrome安装Axure插件
打开原型目录/resources/chrome,重命名axure-chrome-extension.crx,修改后缀为rar,axure-chrome-extension.rar 解压到axure-chrome-extension目录打开Chrome,更多工具->扩展程序,打开开发者模式,选择加…...

【AI+应用】模仿爆款视频二次创作短视频操作步骤
本来不想水这篇的, 剪辑软件估计很多人用的比我还6。 今天自己遇到1个需求,我看到一篇公众号文章的视频觉得有意思,但视频有点长,我没带耳机看视频的习惯,就想着能不能下载下来, 提取视频的音频转为文字&am…...

HTML使用
文章目录 一、简介二、HTML快速入门三、基础标签四、图片、音频、视频标签五、超链接标签六、列表标签七、表格标签八、布局标签九、表单标签十、表单向标签 一、简介 二、HTML快速入门 <html><head><title>你好</title></head><body>再…...

通过联合部署DDoS高防和WAF提升网站防护能力
如果您的网站遭受的攻击既有流量型攻击,又混杂精巧的Web应用层攻击时(例如SQL注入、跨站脚本攻击、命令注入等)时,推荐您组合使用阿里云DDoS高防和Web 应用防火墙 WAF(Web Application Firewall)࿰…...

具体挫折现象的发生以及解法思考:您如果继续不问的话,严重重责就容易来
一 积极想方设法的寻找扭转劣势的方式方法; 目前对于第一条的践行,主要还是依靠打工做事赚取收入。至于个人业务,只能往后推,往后延迟。因为不管您目前居住的环境,还是个人条件都不行,所以无法实行个人业…...

Type-C接口PD协议统一:引领电子科技新纪元的优势解析
在电子科技日新月异的今天,充电接口的统一化已经成为了业界的一大趋势。其中,Type-C接口凭借其传输速度快、使用便捷等优点,迅速成为了市场上的主流选择。而PD(Power Delivery)协议的统一,更是为Type-C接口…...

探讨2024年AI辅助研发的趋势
一、引言 随着科技的飞速发展,人工智能(AI)已经成为当今时代最具变革性的技术之一。AI的广泛应用正在重塑各行各业,其中,AI辅助研发作为科技和工业领域的一大创新热点,正引领着研发模式的深刻变革。从医药…...

Java对接海康威视摄像头实现抓图
目录 一、下载SDK 二、拷贝示例代码 三、拷贝库文件 四、运行Demo 五、抓图业务 六、调参 七、发布Linux正式环境 一、下载SDK 海康开放平台 二、拷贝示例代码 三、拷贝库文件 这时候直接运行ClientDemo会报错,因为缺失库文件! 四、运行Demo …...

浏览器一键重新发起请求
一、需求场景 在前端开发过程中,经常会需要重新请求后台进行代码调试,之前的常规方法是刷新浏览器页面或者点击页面进行交互,这样对多个请求的场景就很方便,但是往往很多时候我们只是单纯的想重新发起一个请求(多个请求…...