当前位置: 首页 > 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…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...