详解MySQL索引失效

news2024/12/23 22:47:31

目录

B+树结构

测试数据

索引失效的情况

没有用到索引

违反左前缀原则

范围查询断索引

like需要分情况

结果数据超过半数


B+树结构

索引失效的根本原因其实就是违反了B+树的结构特性,查找的时候没办法在B+树上继续走下去,所以首先我们来回顾一下B+树的数据结构。

如果对B树、B+树不熟悉的可以看一下博主之前的文章,详细介绍了这两种数据结构:数据结构(8)树形结构——B树、B+树(含完整建树过程)_b+树构造过程__BugMan的博客-CSDN博客

B+树是一棵N叉树,遵循每个节点遵循左<根<右,然后叶节点上是一条分支上的所有数据,且为了方便范围查询,叶子节点用指针连接。

测试数据

以下是本文中用到的测试表结构和数据。

表结构:

create table school_timetable
(
    id   bigint primary key,
    tid bigint,
    cid bigint
)engine = innodb
 default charset = utf8;

表数据:

insert into school_timetable value(1,1,1);
insert into school_timetable value(2,2,2);
insert into school_timetable value(3,3,3);
insert into school_timetable value(4,4,4);

索引失效的情况

索引失效的情况可以归类为以下几类:

  • 没有用到索引
  • 违反左前缀原则
  • 范围查询断索引
  • like需要分情况
  • 结果数据超过半数

没有用到索引

没有用到索引当然索引就不会生效,比如以下条件字段上没有建立任何索引,查找的时候只能老实的全表扫描,从头到尾去找匹配的数。反应在SQL的执行计划上就是type为ALL:

违反左前缀原则

左前缀原则,指在使用复合索引时,只有当查询条件涵盖复合索引的最左边连续一段时,索引才能被充分利用。

注意:只有在MySQL 8版本以前,违反左前缀原则才会造成索引失效,因为在MySQL 8版本以后创建复合索引的时候会在复合索引的每个字段上再单独创建一个索引,这样即使违反了左前缀原则,仍然有单字段索引能走。

左前缀原则其实从B+树的数据机构的特性能很好想明白,在复合索引的时候,索引在树上面的位置一定是按照范围索引的顺序来排序的,先按照复合索引里面的第一个字段来排序,当第一个字段相等时按照第二个字段来排序,以此类推:

以上面的复合索引为例子,假设我们的查询条件是:

number=10001 and birthday = 2001-09-03

明显可以看到先通过number=10001定位后,直接用birthday的话是没办法利用到左大右小的性质继续走下去的,后续的查找只能是去扫描剩下的全部,反应在SQL执行计划里就是从断开的地方开始type跌落为range。

以下是各种违法左前缀原则的情况总结:

范围查询断索引

范围查询断索引,意思是在查询条件中间如果出现了范围查询,从范围查询处开始,后续的索引字段会失效,反应在SQL执行计划上就是type为range,以下用我们的测试数据为例:

index(tid,cid)

范围查询断索引的原因结合B+树的结构特性能很容易想明白,用了范围查询后框出来的是一个范围而不是一个具体的节点,自然走到这里就走不下去了,后续的条件必须去和范围里的每个节点进行比对、匹配。

like需要分情况

在使用like的时候会不会造成索引失效,分以下两种情况:

  • 不以%开头
  • 以%开头

如果开头没用通配符%开头,那么就是个范围查询,SQL执行计划的type是range,如果用了通配符%开头,那么也直接会跌落到SQL的执行计划的type为ALL。这个思考一下就能想明白,用了通配符就必须去每条数据挨着比对才行,根本就走不了B+树。

如果非要使用%的话,可以使用覆盖索引,这样的话能强行将type从全表扫描拉回到index,这是唯一的优化办法,至于其中关于覆盖索引的原理,将会在后续关于SQL索引优化的相关文章中进行讨论。

结果数据超过半数

当查询的结果数量超过总数量的一半时,MySQL 通常会放弃使用索引而执行全表扫描,这是因为对于大多数查询优化器来说,全表扫描比使用索引然后回溯一半以上的数据更快。

当查询的结果数量超过总数量的一半时,这意味着通过索引进行过滤的效果相对较差。在这种情况下,如果使用索引来定位一半以上的数据,并回溯它们以匹配查询条件,可能会导致更多的磁盘 I/O 和 CPU 开销,从而降低查询性能。

因此,为了提高查询性能,MySQL 通常会选择执行全表扫描,以避免索引回溯的开销。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进程控制(中)

目录&#xff1a; 1.status获取子进程退出的退出码和信号 2.不进行位操作方式获取子进程的退出码和信号 3.waitpid 第三个参数options ------------------------------------------------------------------------------------------------------------------------------- 1.…

工业4.0,为什么数字化转型这么难,上了ERP还要上MES

工业4.0时代&#xff0c;中国制造企业已经面临着与国际先进水平的差距&#xff0c;更多的企业在寻找新的发展道路&#xff0c;数字化转型是制造业企业转型升级的必由之路。但是&#xff0c;许多制造型企业由于在传统生产过程中&#xff0c;业务数据不能得到有效监控、生产过程数…

人脸修复增强调研

Real-ESRGAN 工程地址&#xff1a;https://github.com/xinntao/Real-ESRGAN 效果&#xff1a; 人脸增强部分&#xff0c;调用的GFPGAN. GFPGAN 工程地址&#xff1a;https://github.com/TencentARC/GFPGAN 论文效果&#xff1a; BasicSR-ESRGAN&#xff1a; 项目地址&a…

巨杉数据库荣获新睿之星,赋能大湾区技术与产业升级

巨杉数据库凭借多年深耕分布式数据库的技术积累和创新能力&#xff0c;于广州投资年会上荣获新睿之星奖项&#xff0c;该奖项不仅是对巨杉数据库的肯定&#xff0c;也充分肯定广州培育本土高新企业的发展成果。 4月18日&#xff0c;2023年第九届广州国际投资年会在广州白云国际…

2023年10大最佳「内容日历」软件工具

随随便便运行一个社交媒体策略就能成功&#xff0c;这几乎是不可能。你需要提前规划排期&#xff0c;收集资源并与他人合作&#xff0c;来创造出能吸引受众注意力的内容。 所有这些规划、研究和创意都需要一个地方汇总聚合&#xff0c;这就是内容日历软件的用武之地。 有了合…

C++ 多线程:实现一个功能完整的线程池

C 多线程&#xff08;四&#xff09;&#xff1a;实现一个功能完整的线程池 今天我们来聊一聊异步编程的知识。在分布式系统中&#xff0c;一个功能完整的线程池类是一切代码的前提。 一个『合格』的线程池该具备哪些功能&#xff1f; 首先&#xff0c;很自然地想到『线程池类…

被嫌弃可视化太丑?这种可视化大屏搭建方法,分分钟让老板满意

在数据可视化中&#xff0c;使用频率最高的展览方式一定是地图可视化。基本上现有的大屏都是以地图作为主视图来呈现的&#xff0c;没有一幅地图放到大屏中央&#xff0c;已经不好意思给同行说明自己企业数据分析有多牛了。在地图可视化中&#xff0c;最炫酷的一定是3D可视化大…

家用洗地机有什么推荐的吗?家用洗地机哪款好

洗地机是创新、高效的清洁工具&#xff0c;其具有高性能的清洁能力和卓越的操作体验。与传统的清洁工具相比&#xff0c;洗地机可以迅速而彻底地打扫地面&#xff0c;降低清洁时间和人力成本&#xff0c;让我们在工作之余不用花费大量的时间和精力去打扫卫生&#xff0c;下面就…

TCP 协议和 UDP 协议 的优势和劣势

TCP 最核心的价值是提供了可靠性&#xff0c;而 UDP 最核心的价值是灵活&#xff0c;你几乎可以用它来做任何事情。例如&#xff1a;HTTP 协议 1.1 和 2.0 都基于 TCP&#xff0c;而到了 HTTP 3.0 就开始用 UDP 了。UDP 在数据传输、网络控制、音视频、Web 技术中&#xff0c;都…

Chroma向量数据库

嵌入向量&#xff08;vector embedding&#xff09;是表示任何类型数据的 A.I 原生方式&#xff0c;使它们非常适合与各种 A.I 驱动的工具和算法一起使用。 它们可以表示文本、图像&#xff0c;很快还可以表示音频和视频。 有许多创建嵌入的选项&#xff0c;无论是在本地使用已…

Fiddler 微信小程序抓图教程(傻瓜式|汉化版|狗看了直呼内行)

前言 本篇文章主要给大家详细讲解如何用Fiddler爬取微信小程序的图片&#xff0c;内容图文并茂&#xff0c;流程非常简单&#xff0c;我们开始吧。 目录 获取软件并打开点击工具设置相关代理如何抓图答疑总结 一、获取软件并打开 1、通过百度网盘下载获取安装包(链接是永久的…

深度学习学习路线:从入门到精通

深度学习是机器学习的一个分支&#xff0c;已经成为人工智能领域最热门的技术之一。想要深入学习深度学习&#xff0c;需要具备一定的数学和编程基础。以下是一个深度学习学习路线的建议&#xff0c;可以帮助你快速入门深度学习&#xff1a; 数学基础&#xff1a; 线性代数&am…

从模式识别到图像文档分析——浅析场景文本识别研究

目录 一、场景文本识别工作简述二、基于视觉关系预测复杂场景文本识别2.1、FPN骨干网络2.2、文本片段检测模块2.3、候选关系对构建模块2.4、基于关系网络的连接关系预测2.5、损失函数 三、文档图像智能分析与处理前沿研究 文字作为人类语言的书面形式&#xff0c;是文本图像中最…

APP外包项目的线上维护方案

APP的使用已经非常普及&#xff0c;不论是2C还是2B的APP都已经渗透到了我们生活的方方面面&#xff0c;对于APP的开发公司来说APP项目的线上维护是一个非常重要的问题。如果APP项目比较重要而且用户规模比较大&#xff0c;那更需要专业的技术团队来维护。今天和大家分享这方面的…

神经注释精细化:用于肾上腺分析的新3D数据集的开发

文章目录 Neural Annotation Refinement:Development of a New 3D Dataset for Adrenal Gland Analysis摘要本文方法Neural Annotation Refinement 实验结果 Neural Annotation Refinement:Development of a New 3D Dataset for Adrenal Gland Analysis 摘要 人工注释是不完美…

如何将两张图片合成一张,多方式提高10倍效率

如何将两张图片合成一张&#xff1f;在日常工作和生活过程中&#xff0c;图片无处不在。图片能够及时记录当下生活&#xff0c;并且容易保存和传播。随着技术手段的创新和发展&#xff0c;图片质量也在不断提高。如何将多张图片进行有效合并&#xff0c;从而便于保存呢&#xf…

庄懂的TA笔记(十四)<特效:流动 + 扰动>

庄懂的TA笔记&#xff08;十四&#xff09;&#xff1c;特效&#xff1a;流动 扰动> 效果展示&#xff1a; 正文&#xff1a; 大纲&#xff1a; 一、增广&#xff1a; 1、排序问题&#xff1a; 造成这个问题的原因是&#xff0c;他在取背景前&#xff0c;小人的胳膊不算是透…

常用的排序算法--JavaScript

1.冒泡排序 这个函数使用了双重循环&#xff0c;第一个循环用于遍历数组中的每个元素&#xff0c;第二个循环用于比较相邻的元素&#xff0c;如果它们的顺序不正确&#xff0c;则交换它们的位置。在每次内部循环之后&#xff0c;最大的元素都会被移到数组的末尾&#xff0c;因此…

MSR015/MSR025低温漂、低功耗电压基准可pin对pin兼容REF015/REF025

MSR015/MSR025 是低温漂、低功耗、高精度 CMOS 电压基准&#xff0c; 具有0.05% 初始精度、低功耗特点。可pin对pin兼容REF015/REF025。该器件的低输出电压迟滞和低长期输出电压漂移特性&#xff0c;进一步提高稳定性和系统可靠性。 此外&#xff0c;器件的小尺寸和低运行电流特…

《一种使用光电容积图和生物特征进行无需校准的非侵入式血压估计方法》阅读笔记

目录 一、论文摘要 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一…