什么情况下索引会失效

一、索引创建的原则

1、针对数据量较大,且查询比较频繁的表建立索引。

单表超过10万数据,即可增加索引

2、使用经常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引

3、尽量选择区分度高的字段作为索引,尽量建立唯一索引,区分度越高,使用的索引越高效。

例如下图中的address,区分度太小就不适合作为索引

4、尽量使用联合索引(多个字段),减少单列索引,查询的时候,联合索引很多时候可以用到“覆盖索引”,节省存储空间,避免“回表查询”,提高查询效率

5、索引也不是越多越好,尽量控制索引的数量

索引越多,维护索引结构的代价越大,在增删改的时候效率也越低

6、如果要建立索引的列不能存储null值,请在创建表时,使用not null约束,可以增加查询效率

二、什么情况下索引会失效

首先讲一个我碰到的真实案例:

我们公司系统有一张大表,有80多个字段(按照规范其实不应该有这么多字段,历史遗留问题,后面在数据库国产化的时候,准备优化),每天500万-2000万之间的订单数据;原来是使用日期作为分区键,再走主键索引查询的;

结果有一次代码改动,这张表又加了几个字段,而且在其中一条SQL的select 后加上了几个字段,oracle的索引就既不走分区键,也不走主键索引了,通过查看执行计划发现,是执行到了另外几个字段的普通联合唯一索引上,而我们除了select后加了字段以外,where条件没有改动。

出现的现象:应用更新上去后,立马开始告警,数据库连接超时,告警数据库连接池满。新进来的请求无法下单,大面积异常。决定立马执行回退操作;

回退完成(业务正常)后,开始分析原因:除了加了几个字段以外,select 后加了几个字段要查询出来以外,也没有增加改动索引,也没有where条件的任何改动;后面分析执行计划发现索引走偏了,走到另一个普通索引上了

原因分析为:

Oracle优化器会根据查询的代价(Cost)来选择执行计划。当查询中涉及的字段或数据量发生变化时,优化器可能会重新评估使用不同索引的代价。例如:

  • 新添加的字段可能使得查询结果集的大小或数据分布发生了变化,导致优化器认为使用其他索引更高效。

  • 如果查询涉及的字段在新索引中能够覆盖查询所需的所有列(即覆盖索引),优化器可能会优先选择该索引

当然,在我碰到的这次案例中,oracle优化器,显然是帮了倒忙,选择了错误的索引,导致查询时间超长,占用连接池

解决方案:联系DBA人员,强行绑定执行的索引,使用分区键+主键,问题解决

后续又碰到一次类似的问题,但是我们预料到可能出现这样的情况,提前联系了DBA人员支撑,一出现这个问题,就立马绑定索引;

索引失效的条件:

1、违反最左前缀原则

即:当使用一个联合索引(索引了多列)时,查询条件中,,要从索引的最左前列开始,并且不跳过索引中的列,匹配最左前缀法则,走索引

例如:tb_seller表有一个联合索引,是name、status、address三个字段的联合索引;

上述两条SQL执行,没有带上name字段,所以我们可以看到执行计划中,key和key_len都没有表现出这条SQL走了索引,索引失效

2、范围查询右边的列,不能使用索引

即,如果一个联合索引,某个字段使用了范围查询,那么这个字段后面的索引都不能生效

例如:还是上面这个表,第一条SQL使用了正确的联合索引,执行计划的key显示使用了索引tb_seller_index,索引长度key_len显示612,表示用到了name、status、address三个字段的索引,这三个字段的长度,加起来一共是612

而第二条SQL的条件中,status约束了查询范围“>1”,导致address这个字段的索引没有走到,key_len的长度就只有309了,只使用到了name和status

3、不要在索引列上进行运算操作,索引会失效

即:如果对有索引的列,使用运算操作,那么索引可能会失效

如图,还是这张表,组合索引是(name、status、address)

图中的SQL的执行计划中,key为null,说明没有走到索引,导致索引失效,这样查询会很慢

4、字符串不加单引号,造成索引失效

在查询时,如果没有对字符串加单引号,MySQL的查询优化器,会自动的进行类型转换,造成索引失效

上图中的SQL,第一条正确的SQL的执行计划,能够看到key_len是309,是使用了name、status两个字段的索引;

而第二条SQL的执行计划中,key_len是303,仅仅使用了name这个字段上的索引,造成了status上的索引失效;

原因是:第二条SQL条件中字符串类型的字段status后面的=跟的是0,没有带字符串,MySQL就认为是数字类型,而要与status相匹配,则要转换成字符串类型 ;而进行的类型转换,导致了索引失效

5、以%开头的like模糊查询,索引失效。

但是如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。

如图中,第一条,第二条SQL中,组合索引统统失效,第三条中,%在末尾,并没有导致索引失效

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

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

相关文章

内容中台重构企业内容管理流程驱动智能协作升级

内容概要 内容中台作为企业数字化转型的核心基础设施,通过技术架构革新与功能模块整合,重构了传统内容管理流程的底层逻辑。其核心价值在于构建动态化、智能化的内容生产与流转体系,将分散的创作、存储、审核及分发环节纳入统一平台管理。基…

用deepseek学大模型04-模型可视化与数据可视化

deepseek.com: pytorch可视化工具 生成神经网络图 在 PyTorch 中,可视化神经网络结构的常用工具和方法有以下几种,以下将详细介绍它们的用法: 1. TensorBoard (PyTorch 官方集成) PyTorch 通过 torch.utils.tensorboard 支持 TensorBoard&a…

JavaScript设计模式 -- 外观模式

在实际开发中,往往会遇到多个子系统协同工作时,直接操作各个子系统不仅接口繁琐,还容易导致客户端与内部实现紧密耦合。**外观模式(Facade Pattern)**通过为多个子系统提供一个统一的高层接口,将复杂性隐藏…

【性能测试】如何理解“10个线程且10次循环“的请求和“100线程且1次循环“的请求

在性能测试中,我们常常会见到不同的并发配置:比如“10个线程且10次循环”与“100线程且1次循环”。乍一看,这两个设置的总请求数都是100次,但它们对系统的压力和测试场景却截然不同。了解其中的区别,能帮助你更精准地模…

Spring Boot 实战:轻松实现文件上传与下载功能

目录 一、引言 二、Spring Boot 文件上传基础 (一)依赖引入 (二)配置文件设置 (三)文件上传接口编写 (一)文件类型限制 (二)文件大小验证 &#xff0…

【Golang】GC探秘/写屏障是什么?

之前写了 一篇【Golang】内存管理 ,有了很多的阅读量,那么我就接着分享一下Golang的GC相关的学习。 由于Golang的GC机制一直在持续迭代,本文叙述的主要是Go1.9版本及以后的GC机制,该版本中Golang引入了 混合写屏障大幅度地优化了S…

DeepSeek教unity------MessagePack-03

数据契约兼容性 你可以使用 [DataContract] 注解代替 [MessagePackObject]。如果类型用 DataContract 进行注解,可以使用 [DataMember] 注解代替 [Key],并使用 [IgnoreDataMember] 代替 [IgnoreMember]。 然后,[DataMember(Order int)] 的…

【对比】Pandas 和 Polars 的区别

Pandas vs Polars 对比表 特性PandasPolars开发语言Python(Cython 实现核心部分)Rust(高性能系统编程语言)性能较慢,尤其在大数据集上(内存占用高,计算效率低)极快,利用…

百度千帆平台对接DeepSeek官方文档

目录 第一步:注册账号,开通千帆服务 第二步:创建应用,获取调用秘钥 第三步:调用模型,开启AI对话 方式一:通过API直接调用 方式二:使用SDK快速调用 方式三:在千帆大模…

49. c++计时器

为了测试某段特定代码的执行时间&#xff0c;体现代码的性能&#xff0c;可以使用计时器对代码段计时。下面使用std::chrono中的api编写简单案例&#xff1a; // // main.cpp // HelloWorld // // Created by on 2024/11/28. //#include <iostream> #include <vec…

Natural Language Processing NLP

NLP 清晰版本查看 Sentence segmentation (split)Tokenisation (split)Named entity recognition (combine) 概念主要內容典型方法Distributional Semantics&#xff08;分佈式語義&#xff09;&#xff08;分銷語義&#xff08;分佈式語義&#xff09;單詞的語義來自於它的…

Linux中线程创建,线程退出,线程接合

线程的简单了解 之前我们了解过 task_struct 是用于描述进程的核心数据结构。它包含了一个进程的所有重要信息&#xff0c;并且在进程的生命周期内保持更新。我们想要获取进程相关信息往往从这里得到。 在Linux中&#xff0c;线程的实现方式与进程类似&#xff0c;每个线程都…

HarmonyOS:使用List实现分组列表(包含粘性标题)

一、支持分组列表 在列表中支持数据的分组展示&#xff0c;可以使列表显示结构清晰&#xff0c;查找方便&#xff0c;从而提高使用效率。分组列表在实际应用中十分常见&#xff0c;如下图所示联系人列表。 联系人分组列表 在List组件中使用ListItemGroup对项目进行分组&#…

django上传文件

1、settings.py配置 # 静态文件配置 STATIC_URL /static/ STATICFILES_DIRS [BASE_DIR /static, ]上传文件 # 定义一个视图函数&#xff0c;该函数接收一个 request 参数 from django.shortcuts import render # 必备引入 import json from django.views.decorators.http i…

【前端知识】浏览器兼容方案polyfill

浏览器兼容方案polyfill 什么是 Polyfill&#xff1f;Polyfill 的作用Polyfill 的工作原理1. **特性检测**2. **加载 Polyfill**3. **模拟实现** Polyfill 的常见场景Polyfill 的使用方式Polyfill 的优缺点优点缺点 常见的 Polyfill 库总结 什么是 Polyfill&#xff1f; Polyf…

C#学习之DateTime 类

目录 一、DateTime 类的常用方法和属性的汇总表格 二、常用方法程序示例 1. 获取当前本地时间 2. 获取当前 UTC 时间 3. 格式化日期和时间 4. 获取特定部分的时间 5. 获取时间戳 6. 获取时区信息 三、总结 一、DateTime 类的常用方法和属性的汇总表格 在 C# 中&#x…

dedecms 开放重定向漏洞(附脚本)(CVE-2024-57241)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…

如何选择合适的超参数来训练Bert和TextCNN模型?

选择合适的超参数来训练Bert和TextCNN模型是一个复杂但关键的过程&#xff0c;它会显著影响模型的性能。以下是一些常见的超参数以及选择它们的方法&#xff1a; 1. 与数据处理相关的超参数 最大序列长度&#xff08;max_length&#xff09; 含义&#xff1a;指输入到Bert模…

AWS 前端自动化部署流程指南

本文详细介绍从前端代码开发到 AWS 自动化部署的完整流程。 一、流程概览 1.1 部署流程图 #mermaid-svg-nYg7k6L5IKVBjDtr {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nYg7k6L5IKVBjDtr .error-icon{fill:#552…

Office word打开加载比较慢处理方法

1.添加safe参数 ,找到word启动项,右击word,选择属性 , 添加/safe , 应用并确定 2.取消加载项,点击文件,点击选项 ,点击加载项,点击转到,取消所有勾选,确定。