MySQL中什么情况下会出现索引失效?如何排查索引失效?

目录

  • 1-引言:什么是MySQL的索引失效?(What、Why)
    • 1-1 索引失效定义
    • 1-2 为什么排查索引失效
  • 2- 索引失效的原因及排查(How)
    • 2-1 索引失效的情况
      • ① 索引列参与计算
      • ② 对索引列进行函数操作
      • ③ 查询中使用了 OR 两边有范围查询 > 或 <
      • ④ like 操作:以 % 开头的 like 查询
      • ⑤ 不等于比较 !=
      • ⑥ order by
      • ⑦ 使用 IN
    • 2-2 索引失效的排查
      • 使用 explain 排查
      • 需要关注的字段:type、key、extra
  • 3- 总结:索引失效知识点小结


image.png

1-引言:什么是MySQL的索引失效?(What、Why)

1-1 索引失效定义

  • 在MySQL中,索引是用来加快检索数据库记录的一种数据结构
  • 索引失效指的是在进行查询操作时,本应该使用索引来提升查询效率的场景下,数据库没有利用索引,而是采用了全表扫描的方式,这会大大增加查询时间和系统负担。

1-2 为什么排查索引失效

排查索引失效的原因是至关重要的,主要有以下方面:

  • 1. 提高查询效率:索引的主要目的是加快数据检索速度。当索引失效时,数据库系统可能退回到更慢的查询方法,如全表扫描,这会显著增加查询时间和降低整体性能。
  • 2. 降低服务器负载:使用索引可以显著减少数据库处理查询所需处理的数据量,从而减少CPU使用率和IO读写。如果索引失效,数据库必须加载更多数据,这会增加服务器的负载和资源消耗。

2- 索引失效的原因及排查(How)

2-1 索引失效的情况

  • 以以下的学生信息表举例
CREATE TABLE `student_info` (
  `student_id` int(11) NOT NULL AUTO_INCREMENT,
  `student_name` varchar(50) NOT NULL,
  `student_age` int(11) DEFAULT NULL,
  `enrollment_date` datetime DEFAULT NULL,
  PRIMARY KEY (`student_id`),
  UNIQUE KEY `student_name` (`student_name`),
  KEY `student_age` (`student_age`),
  KEY `enrollment_date` (`enrollment_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 表的索引情况:
  • 总结来说,表 student_info 有四个字段上定义了索引:
    • 一个主键索引 student_id
    • 一个唯一索引 student_name
    • 以及两个普通索引 student_ageenrollment_date

image.png

① 索引列参与计算

  • 正常的通过 age 去做查询
    • 走的是 student_age 的索引
explain select * from student_info where student_age=21;

image.png

  • 如果索引列参与了计算进行查询
    • 索引失效
explain select * from student_info where student_age+1 =21;

image.png

  • 如果不是对列进行计算,而是对列等号右侧的值进行计算,结果还是走索引的。

image.png


② 对索引列进行函数操作

  • 正常的查询——>走索引
explain select * from student_info where enrollment_date = '2022-09-04 08:00:00';

image.png

  • 如果对查询的字段加上函数操作时,索引失效
explain select * from student_info where YEAR(enrollment_date) = 2022;

image.png


③ 查询中使用了 OR 两边有范围查询 > 或 <

  • 正常情况查询,查询使用 student_name 索引
explain select * from student_info where student_name='Helen' and student_age>15;

image.png

  • 如果使用了 OR 进行查询,两边包含范围查询 > 或 <
    • 此时索引失效
explain select * from student_info where student_name='Helen' or student_age>15;

image.png

  • 如果没有范围查询下使用 OR 还是正常走索引
explain select * from student_info where student_name='Helen' or student_age=18;

image.png


④ like 操作:以 % 开头的 like 查询

  • 以 % 开头的 LIKE 查询比如 LIKE ‘%abc’;;

⑤ 不等于比较 !=

  • 在MySQL中 != 比较有可能会导致不走索引,但如果对 id 进行 != 比较,是有可能走索引的。
  • != 比较是否走索引,与索引的选择、数据分布情况有关,不单是由于查询包含 != 而引起的。

⑥ order by

  • 如果使用 order by 时,表中的数据量很小,数据库会直接在内存中进行排序,而不使用索引

image.png


⑦ 使用 IN

  • 使用 IN 的时候,有可能走索引,也有可能不走索引。当在 IN 的取值范围比较大的时候有可能会导致索引失效,走全表扫描(NOT ININ的失效场景相同)。

2-2 索引失效的排查

使用 explain 排查

  • 和 MySQL 慢查询的排查类似,使用 Explain 语句来进行排查。

需要关注的字段:type、key、extra

  • 我们可以根据 key、type、extra 来判断一条语句是否走了索引。
  • 一般走索引的情况 :
    • key 值不为 null
    • type 值应该为 ref、eq_ref、range、const 这几个
    • extra 的话如果是 NULL,或者 using indedx,using index condition 都是可以的

索引失效情况

  • 如果一条语句出现了 type 值为 all、key 为 nullextra = Using where 此时是索引失效了

此时就需要排查索引失效的原因

    1. 索引是否符合最左前缀匹配
    1. 查询语句出现以上 7 种情况

3- 总结:索引失效知识点小结

MySQL中什么情况下会出现索引失效?如何排查索引失效?
回答
:::info
MySQL中索引失效的情况有

    1. 比如联合索引在查询的过程中不符合最左前缀原则,此时联合索引会失效
    1. 查询的语句 索引列 进行计算,此时会使得索引失效
    1. 查询的语句 对索引列进行了函数操作,比如利用了 **YEAR()** 函数
    1. 查询语句中 包含 **OR** ,且 OR 两侧有范围查询 也就是 **>****<** 此时索引会失效
    1. 查询语句中 使用了 **like****like** 中存在 以**%** 开头的匹配,此时索引会失效
    1. 查询语句中 使用了 **!=** 进行比较,但这种情况也和数据的分布情况有关系,
    1. 当数据表中的数据较少,使用 **order by** 的时候,可能会不走索引直接在内存中进行排序
    1. 当使用 **IN**** **时候取值范围比较大的时候有可能会导致索引失效

索引失效的排查

  • ① 使用 Explain 对 SQL 语句进行排查
  • 需要 关注的字段有 **type****key****extra**
  • 如果一条语句出现了 type 值为 all、key 为 nullextra = Using where 此时是索引失效了

此时就需要排查索引失效的原因,是否存在以上情况
:::

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.7设计模式——Proxy 代理模式(结构型)

意图 为其它对象提供一种代理以控制这个对象的访问。 结构 Proxy保存一个引用使得代理可以访问实体&#xff1b;提供一个与Subject的接口相同的接口&#xff0c;使代理可以用来替代实体&#xff1b;控制实体的存取&#xff0c;并可能负责创建和删除它&#xff1b;其他功能依赖…

项目分享|基于ELF 1开发板的MQTT远程温湿度监测系统

今天非常荣幸向各位小伙伴详细展示一个由共创社成员完成的MQTT远程温湿度监控系统项目。该项目借助ELF 1开发板作为核心技术支撑&#xff0c;成功实现了对各类环境空间中温湿度数据的实时、远程、稳定监测。该系统不仅集成了先进的数据采集模块&#xff0c;用于精确感知现场环境…

uniapp问题归类

最近使用uniapp中&#xff0c;遇到了一些问题&#xff0c;这边mark下。 1. 启动页变形 设置启动页的时候发现在部分android手机上启动页被拉伸了&#xff0c;最后看了下官方建议使用9.png图 生成9.png地址&#xff0c;推荐图片大小为1080x2340 uniapp推荐官方地址传送门 我…

JAVA实现easyExcel动态生成excel

添加pom依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency><!--工具类--> <dependency><groupId>cn.hutool</groupId><…

在Mac M1笔记本上跑大语言模型llama3的4个步骤?(install、pull、run、ask)

要点 Ollama一个功能强大的本地大语言模型LLM运行工具&#xff0c;支持很多模型&#xff0c;并且操作极其简单快速回忆步骤&#xff1a; 下载ollama工具&#xff1a;https://ollama.com/download 下载模型&#xff1a;ollama pull llama3 #根据libs列表直接指定名字 运行模型…

安卓studio插件开发(一)本地搭建工程

下载idea 社区版本 建立IDE Plugin工程 点击create就行&#xff0c;新建立的工程长这样 比较重要的文件 build.gradle&#xff1a;配置工程的参数 plugin.xml&#xff1a;设置插件的Action位置 build.gradle.kts内容如下&#xff1a; plugins {id("java")id(&quo…

常用的时间序列分析方法总结和代码示例

时间序列是最流行的数据类型之一。视频&#xff0c;图像&#xff0c;像素&#xff0c;信号&#xff0c;任何有时间成分的东西都可以转化为时间序列。 在本文中将在分析时间序列时使用的常见的处理方法。这些方法可以帮助你获得有关数据本身的见解&#xff0c;为建模做好准备并…

网站建设价格多少合理

网站建设价格多少合理&#xff0c;是很多企业和个人在寻找网站建设服务时&#xff0c;最为关心的问题之一。在选择好的网站建设服务商前&#xff0c;了解合理的网站建设价格&#xff0c;对于选择合适的网站建设服务商具有重要的参考作用。下面我们就来讨论一下&#xff0c;网站…

vue+element 树形结构 改成懒加载模式(原理element有),这里只做个人理解笔记

1 找到属性标签添加 lazy 和 :load"loadNode" 这两个属性 2 引入树形接口,并和后端约定好传值,(拿我的举例 第一次获取全部父级默认第一次传参数:{ parentId : 0},可获取全部父级 第二次通过点击的子级把子级id传进去,这一步就用到了:load"loadNode&quo…

区块链技术与应用学习笔记(10-11节)——北大肖臻课程

目录 10.分岔 ①什么是分叉&#xff1f; ②导致分叉的原因&#xff1f; ③在比特币新共识规则发布会会导致什么分叉&#xff1f; 什么是硬分叉&#xff1f; 硬分叉例子&#xff1f; 什么是软分叉&#xff1f; 软分叉和硬分叉区别&#xff1f; 软分叉实例 11.问答 转…

在no branch上commmit后,再切换到其他分支,找不到no branch分支的修改怎么办?

解决办法 通过git reflog我们可以查看历史提交记录&#xff0c;这里的第二条提交&#xff08;fbd3ea8&#xff09;就是我在no branch上的提交。 再通过git checkout -b backup fbd3ea8&#xff0c;恢复到上次提交的状态&#xff0c;并且为其创建个分支backup&#xff0c;此时…

ES6要点

ES6/ES7内容解析 一、变量/赋值1、变量2、解构赋值 二、函数1、箭头函数2、默认参数3、参数展开&#xff08;剩余参数&#xff0c;数组展开&#xff09; 三、数组/JSON1、 数组2、JSON 四、字符串1、字符串模版2、字符串方法 五、面向对象1、类2、bind()3、箭头函数的this 六、…

【Python特征工程系列】递归特征消除法分析特征重要性-SVC模型为例(案例+源码)

这是我的第268篇原创文章。 一、引言 递归特征消除&#xff08;RFE&#xff09;是一种高效的特征选择方法&#xff0c;它通过递归减少特征的数量来找出模型最重要的特征。本文基于支持向量机分类器作为选择器的基模型&#xff0c;采用递归消除法进行特征筛选。 二、实现过程 2…

HTTP与HTTPS 对比,区别详解(2024-04-25)

一、简介 HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 工作在 TCP/IP 模型之上&#xff0c;通常使用端口 80。 HTTPS&#xf…

Jmeter(十九) - 从入门到精通 - JMeter监听器 -上篇(详解教程)

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 监听器用来监听及显示JMeter取样器测试结果&#xff0c;能够以树、表及图形形式显示测试结果&#xff0c;也可以以文件方式保存测试结果&#xff0c;JMeter测试结果文件格式多样…

使用docker安装本地pdf工具集合Stirling-PDF

平时工作中需要处理pdf&#xff0c;市面上的很多工具都需要充会员才能使用&#xff0c;偶然发现了一个可私有化部署且易于使用的PDF在线工具&#xff0c;使用docker部署&#xff0c;使用起来非常方便&#xff0c;而且功能齐全。 这里是官网&#xff1a; https://pdf.errui.cc/…

任务调度xxljob的使用记录

1.基本使用 a.下载代码&#xff0c;地址&#xff1a;https://gitee.com/xuxueli0323/xxl-job.git b.执行sql&#xff0c;修改配置&#xff0c;启动任务调度中心的代码 启动代码后任务调度中心访问地址&#xff1a;http://localhost:8080/xxl-job-admin&#xff08;自己机器…

D-Wave 推出快速退火功能,扩大量子计算性能增益

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;1400字丨6分钟阅读 摘要&#xff1a;量子计算公司 D-Wave 宣布在其 Leap™ 实时量子云服务中的所有量子处理单元 (QPU) 上推出新的快速退火功能。…

30 OpenCV 点多边形测试

文章目录 点多边形测试pointPolygonTest示例 点多边形测试 pointPolygonTest pointPolygonTest( InputArray contour,// 输入的轮廓 Point2f pt, // 测试点 bool measureDist // 是否返回距离值&#xff0c;如果是false&#xff0c;1表示在内面&#xff0c;0表示在边界上&a…

“一个有趣的C语言代码”分析

“一个有趣的C语言代码” 一个有趣的C语言代码-流浪的海豚-ChinaUnix博客 #include <stdio.h> int print() {printf("hello world!\n");return 0; } int main(void) {long base[0];long* result base3;*(result1) *result;*result (long)print;return 0; …
最新文章