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

news/2024/5/19 16:06:21

目录

  • 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中什么情况下会出现索引失效?如何排查索引失效?
回答
在这里插入图片描述


http://www.mrgr.cn/p/61263304

相关文章

rust中结构体的属性默认是不能修改的,要想修改可以有两种方式

Rust中结构体里面的属性默认是不支持修改的&#xff0c;而且默认不是pub的&#xff0c;要想修改的话&#xff0c;有两种方式&#xff0c;我以为和python里面的类似呢&#xff0c;但是还是需要一点技术含量的。如果想在引到外部修改&#xff0c;需要声明pub&#xff0c;如果想在…

Ubuntu 24.04 LTS x86_64 OVF (sysin) - VMware 虚拟机模板

Ubuntu 24.04 LTS x86_64 OVF (sysin) - VMware 虚拟机模板Ubuntu 24.04 LTS x86_64 OVF (sysin) - VMware 虚拟机模板 Ubuntu 24.04 LTS (GNU/Linux 6.8-generic x86_64) 请访问原文链接:Ubuntu 24.04 LTS x86_64 OVF (sysin) - VMware 虚拟机模板,查看最新版。原创作品,转…

路由选择协议三剑客--BGP协议

一、背景 边界网关协议(Border Gateway Protocol, BGP)是用来处理像因特网规模大小的网络协议,能够妥善处理好不相关路由域间的多路连接协议。BGP一般用于企业和企业之间,也就是运营商骨干网的通信,一般使用在AS内或AS间通信,在大型企业网中实现的比较多。 内部网关协议只…

Multitouch 1.27.28 免激活版 mac电脑多点触控手势增强工具

Multitouch 应用程序可让您将自定义操作绑定到特定的魔术触控板或鼠标手势。例如&#xff0c;三指单击可以执行粘贴。通过执行键盘快捷键、控制浏览器的选项卡、单击鼠标中键等来改进您的工作流程。 Multitouch 1.27.28 免激活版下载 强大的手势引擎 精心打造的触控板和 Magic …

【分布式通信】NPKit,NCCL的Profiling工具

NPKit介绍 NPKit (Networking Profiling Kit) is a profiling framework designed for popular collective communication libraries (CCLs), including Microsoft MSCCL, NVIDIA NCCL and AMD RCCL. It enables users to insert customized profiling events into different C…

Ubuntu 22.04.4 LTS磁盘扩容

安装gpartedsudo apt updatesudo apt install gparted然后启动gpartedsudo gparted启动成功会完成一个新的对话框,直接调整磁盘大小的话会提示失败扩容查看只读文件系统的详细信息,点击Information(信息) 查看磁盘的挂载位置按顺序运行以下命令sudo -i mount -o remount -r…

K8s: 部署 kubernetes dashboard

部署 Dashboard K8s 官方有一个项目叫 dashboard&#xff0c;通过这个项目更方便监控集群的状态 官方地址: https://github.com/kubernetes/dashboard 通常我们通过命令行 $ kubectl get po -n kube-system 能够查看到集群所有的组件&#xff0c;但这样的方式比较不太直观 …

Jenkins 简述及其搭建

什么是持续集成?持续集成(CI)是在软件开发过程中自动化和集成许多团队成员的代码更改和更新的过程。在 CI 中,自动化工具在集成之前确认软件代码是有效且无错误的,这有助于检测错误并加快新版本的发布。什么是持续交付?持续交付 (CD) 是指每天多次将新软件投入生产,自动…

火山引擎VeDI:如何高效使用A/B实验,优化APP推荐系统

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群在移动互联网飞速发展的时代,用户规模和网络信息量呈现出爆炸式增长,信息过载加大了用户选择的难度,这样的背景下,推荐系统应运而生,为用户提供个性化的内容推荐。推荐系统在不断迭代…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(三)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 4 - 6节&#xff09; P5《04.快速入门》 本节来实现一个 HelloWorld 效果&#xff1a; 1、打开编辑器&#xff0c;选择新建项目&…

查看svn密码

查看svn密码 下载TSvnPwd.exe, 这是一个压缩包 打开这个文件路径 C:\Users\浅笑\AppData\Roaming\Subversion\auth\svn.simple 把下载好压缩包,解压至这个目录中本文来自博客园,作者:浅笑,转载请注明原文链接:https://www.cnblogs.com/qx-blog/p/18159483

目标检测网络YOLO进化之旅

yolo系列网络在目标检测领域取得了巨大的成功&#xff0c; 尤其是在工程实践中&#xff0c; 以其出色的性能优势获得了广泛的应用落地。 YOLO的前3个版本是由同一个作者团队出品&#xff0c; 算是官方版本。 之后的版本都是各个研究团队自己改进的版本&#xff0c; 之间并无明…

amCharts使用

参考 代码如下<!DOCTYPE html> <html><head><script src="https://cdn.amcharts.com/lib/5/index.js"></script><script src="https://cdn.amcharts.com/lib/5/xy.js"></script><script src="https://c…

是时候了解替代FTP传文件的最优传输方案了!

目前越来越多的企业在寻找替代FTP传文件的方案,主要原因在于其固有的一些弊端,在现代企业数据传输需求中可能导致安全性、效率和可靠性方面的问题。以下是FTP的一些主要弊端: 1.数据传输不加密:FTP在传输过程中不加密数据,包括用户名和密码、命令和数据,这使得敏感信息容…

iOS 在OC旧项目中使用Swift进行混编

iOS 在OC旧项目中使用Swift进行混编 1、创建桥接文件 ​ 第一次在Swift创建OC文件&#xff0c;或者第一次OC创建Swift时&#xff0c;xcode会提示桥接&#xff0c;Creat Bridging Header即可,这个文件用于Swift调用OC文件&#xff0c;与OC调用Swift无关。 2、在TARGETS中设置D…

云原生Kubernetes: K8S 1.29版本 部署Nexus

目录 一、实验 1.环境 2.搭建NFS 3. K8S 1.29版本 部署Nexus 二、问题 1.volumeMode有哪几种模式 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注masterK8S master节点1.29.0192.168.204.8 node1K8S node节点1.29.0192.168.204.9node2K…

idea2023去除方法烦人提示

如果你遇到这样的问题请看 再看 已经没有了 我的idea版本

netstat tasklist taskkill配合使用

1.查找指定的端口号:netstat -ano | findstr 端口号 2.查找指定的进程号对应的程序名:tasklist /FI "PID eq 进程号" ,/FI "筛选器 eq 对应的值 " 或者 tasklist | findstr 进程号 或者 3.杀死指定进程:taskkill /t /f /pid 进程号