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

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

Python数据处理实战(4)-上万行log数据提取并作图进阶版

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

JavaWeb Tomcat启动、部署、配置、集成IDEA

web服务器软件 服务器是安装了服务器软件的计算机&#xff0c;在web服务器软件中&#xff0c;可以部署web项目&#xff0c;让用户通过浏览器来访问这些项目。 Web服务器是一个应用程序&#xff08;软件&#xff09;&#xff0c;对HTTP协议的操作进行封装&#xff0c;使得程序…...

关于Vue3的一些操作

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

外贸常用的出口认证 | 全球外贸数据服务平台 | 箱讯科技

出口认证是一种贸易信任背书&#xff0c;对许多外贸从业者而言,产品的出口认证和当前的国际贸易环境一样复杂多变&#xff0c;不同的目标市场、不同的产品类别,所需要的认证及标准也不同。 国际认证 01 IECEE-CB IECEE-CB体系的中文含义是“关于电工产品测试证书的相互认可体…...

C++ 标准库类型string

C/C总述&#xff1a;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按钮 图标按钮通常适用于切换按钮&#xff0c;允许选择或选择单个选项 取消选择&#xff0c;例如在项目中添加或删除星号。 <IconButton aria-lab…...

Express学习(三)

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

influxdb2.0插入数据字段类型出现冲突问题解决

一、问题出现 一个学校换热站自控系统&#xff0c;会定时从换热站获取测点数据&#xff0c;并插入到influxdb数据库中。influxdb插入数据时&#xff0c;报错提示&#xff1a; com.influxdb.exceptions.UnprocessableEntityException: failure writing points to database: par…...

[C++]类和对象,explicit,static,友元,构造函数——喵喵要吃C嘎嘎4

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…...

物联网的商业模式洞察

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

智能指针基础知识【C++】【RAII思想 || unique_ptr || shared_ptrweak_ptr || 循环引用问题】

目录 一&#xff0c;为什么需要智能指针 二&#xff0c;内存泄露的基本认识 1. 内存泄露分类 2. 常见的内存检测工具 3&#xff0c;如何避免内存泄露 三&#xff0c;智能指针的使用与原理 1. RAII思想 2. 智能指针 &#xff08;1. unique_ptr &#xff08;2. shared_…...

leetcode:反转链表II 和k个一组反转链表的C++实现

反转链表II 问题描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 ListNode* reverseBetween(ListNode* head, int left, int right) {ListNode *…...

ERD Online 快速启动指南:代码下载到首次运行的全流程攻略 ️

&#x1f680; 一、代码下载 ERD online前端代码正常拉取即可&#x1f44c; 后端代码含有子模块&#xff0c;拉取命令如下&#xff1a; git clone --recurse-submodules https://github.com/www-zerocode-net-cn/martin-framework.git &#x1f6e0;️ 二、代码构建 &#x1f3…...

c++ 11 新特性 不同数据类型之间转换函数之const_cast

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

C++从零开始的打怪升级之路(day45)

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

小鹅通前端实习一面

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

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...