索引失效的问题是如何排查的,有哪些种情况?

MySQL索引失效的场景 表中的某些列可能会存储 NULL 值,如果把这些 NULL 值都放到记录的真实数据中会比较浪费空间,所以 Compact 行格式把这些值为 NULL 的列存储到 NULL值列表中。如果存在允许 NULL 值的列,则每个列对应一个二进制位(bit),二进制位按照列的顺序逆序排列。二进制位的值为1时,代表该列的值为NULL。二进制位的值为0时,代表该列的值不为NULL。另外,NULL 值列表必须用整数个字节的位表示(1字节8位),如果使用的二进制位个数不足整数个字节,则在字节的高位补 0。 阅读详情

1.11.1 面试考察重点

1. 面试官的考察目标

  • SQL优化能力:对索引工作原理的理解深度
  • 问题诊断技巧:系统化排查问题的能力
  • 实战经验:实际处理索引失效问题的经验
  • 知识广度:对各类失效场景的掌握程度

2. 关键关注点

  • 排查工具:使用哪些工具诊断索引失效
  • 失效场景:常见的索引失效模式
  • 解决方案:如何修复失效问题
  • 预防措施:如何避免索引失效

由于篇幅限制,只能给大家展示小部分内容,

全套面试笔记及答案【点击此处】即可免费获取

1.11.2 面试核心知识点详解

1.11.2.1 索引失效定义

在MySQL中,索引是用来加快检索数据库记录的一种数据结构。

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

1.11.2.2 为什么排查索引失效

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

1. 提高查询效率:索引的主要目的是加快数据检索速度。当索引失效时,数据库系统可能退回到更慢的查询方法,如全表扫描,这会显著增加查询时间和降低整体性能。

2. 降低服务器负载:使用索引可以显著减少数据库处理查询所需处理的数据量,从而减少CPU使用率和IO读写。如果索引失效,数据库必须加载更多数据,这会增加服务器的负载和资源消耗。

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

以下的学生信息表举例

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_age 和 enrollment_date。

① 索引列参与计算

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

 

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

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

② 对索引列进行函数操作

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

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

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

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

  • 如果使用了 OR 进行查询,两边包含范围查询 > 或 <
    • 此时索引失效

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

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

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

不等于比较 !=

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

order by

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

使用 IN

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

使用 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 为 null,extra = Using where 此时是索引失效了

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

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

 ……

索引失效问题排查 MySQL数据库排查索引失效问题 阅读详情

相关推荐

【索引失效如何排查】

10、 索引列使用了隐式类型转换:当查询语句中的查询条件与索引列类型不一致时,数据库会自动进行类型转换。9、 索引列被过度使用:当索引列被过度使用时,可能会导致索引失效。6、 检查数据库的配置和性能:如果数据库的配置和性能不足,可能会导致索引失效,因为查询可能需要很长时间才能完成。4、 检查索引列的选择:索引列的选择非常重要,不同的列选择可能会导致不同的索引效率。8、 多个表连接时没有使用索引:当查询语句涉及到多个表连接时,如果没有建立连接所需要的索引,可能会导致索引失效。

学无止境 3891

MySQL高级篇——索引失效的11种情况

索引优化思路、要尽量满足全值匹配、最佳左前缀法则、主键插入顺序尽量自增、计算、函数导致索引失效、类型转换(手动或自动)导致索引失效、范围条件右边的列索引失效、不等于符号导致索引失效、is not null、not like无法使用索引、左模糊查询导致索引失效、“OR”前后存在非索引列,导致索引失效、不同字符集导致索引失败,建议utf8mb4

种一棵树最好的时间是十年前,其次是现在 3万+

网格自适应实战 | 攻克超弹性体大变形不收敛难题

本文针对超弹性体(如橡胶)在大变形仿真中因网格严重扭曲导致计算不收敛的难题,提供了基于ANSYS网格自适应技术的实战解决方案。文章详细阐述了从问题诊断、模型准备到核心参数设置的完整流程,并介绍了结合混合U-P单元技术的进阶组合策略,有效攻克了材料压缩等场景下的仿真收敛问题。

week9的博客 515

索引失效的情况及解决(超详细)

mysql索引优化

sy_white的博客 8万+

R以及Rstudio超详细安装教程(包括安装过程中出现的问题)

R安装及Rstudio安装,以及安装中出现的问题

2301_76908257的博客 1万+

手把手教你用C++和NI-VISA写个简易仪器上位机(附QT工程配置)

本文详细介绍了如何使用C++和QT框架结合NI-VISA驱动开发跨平台仪器控制上位机软件。从Ubuntu环境配置、VISA通信核心架构设计到QT界面与业务逻辑解耦,提供了完整的实战指南和代码示例,帮助开发者快速构建专业级仪器控制程序。

weixin_42522374的博客 273

mysql索引失效的常见9种原因详解

目录 前言: 1.最佳左前缀法则 2.主键插入顺序 3.计算、函数、类型转换(自动或手动)导致索引失效 4.范围条件右边的列索引失效 5.不等于(!= 或者<>)导致索引失效 6.is null可以使用索引,is not null无法使用索引 7.like以通配符%开头索引失效 8.OR 前后只要存在非索引的列,都会导致索引失效 9.数据库和表的字符集统一使用utf8mb4 特别鸣谢: 前言: MySQL中提高性能的一个最有效的方式是对数据表设计合...

qq_63815371的博客 3万+

Ubuntu20.04实时内核补丁PREEMPT_RT编译与安装全流程解析

本文详细解析了在Ubuntu20.04系统上编译与安装实时内核补丁PREEMPT_RT的全流程。从内核与补丁版本匹配、编译环境准备,到内核配置、编译排错,再到最终安装、验证与进阶优化,提供了手把手的实战指南,旨在帮助机器人、工业控制等对实时性有苛刻要求的开发者构建低延迟、高确定性的Linux系统。

weixin_29213827的博客 186

导致oracle 本地分区索引失效的一种情况

新系统改造,对于分区表上的索引都改成local类型的分区索引,便以为高枕无忧,自此任由他人对表进行DDL操作,也无需担心索引失效的情况了。然而,天有不测风云。在巡检系统运行情况时候,发现一条sql语句平均执行时间到达0.2秒,然而该语句正常情况下应该几毫秒结束战斗。查看执行计划,竟然是全表扫描,查看索引情况,创建了相关索引,并且是本地分区索引。于是,怀疑是统计信息出现问题了,但右击属性,看到num...

killvoon的专栏 4768

A Mathematical Framework for Transformer Circuits—(一)

transformer数学理解理论

qq_42208244的博客 2660

H3C交换机S-MLAG实战:如何用bond4模式实现服务器高可用(附避坑指南)

本文详细介绍了H3C交换机S-MLAG技术与服务器bond4模式的实战配置,帮助实现跨设备链路聚合的服务器高可用方案。通过解析S-MLAG技术优势、bond4模式选择、关键配置步骤及常见问题排查,提供了一套完整的避坑指南和优化建议,适用于企业级网络架构的高可用需求。

weixin_30790841的博客 465

索引失效场景大排查:通过执行计划分析、字段类型匹配检查实现索引高效利用的实操技巧

摘要:索引失效是数据库性能骤降的常见原因,会导致查询从毫秒级骤降至秒级。本文系统分析索引失效的本质与影响,指出执行计划分析是排查核心手段,详细解读执行计划中type、key等关键字段的失效特征。重点梳理函数操作索引字段、类型不匹配、联合索引最左前缀缺失等高发场景的解决方案,强调字段类型匹配检查的重要性。最后提出从索引设计、查询优化到环境维护的全方位优化策略,并给出标准化排查流程,为数据库性能优化提供系统化解决方案。

jingjing45678的博客 1018

python实现纵横向拉开档次法 (附完整源码)

python实现纵横向拉开档次法 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 776

一文总结常见项目排查

当某一个 SQL 语句扫描了大量的数据时,在 Buffer Pool 空间比较有限的情况下,可能会将 Buffer Pool 里的所有页都替换出去,导致大量热数据被淘汰了,等这些热数据又被再次访问的时候,由于缓存未命中,就会产生大量的磁盘 IO,MySQL 性能就会急剧下降,这个过程被称为 Buffer Pool 污染。线程快照是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因, 如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。

xyliiiiiL的博客 919

风控域——决策引擎系统设计

本文详细介绍了风控决策引擎系统的设计与应用。决策引擎系统是一种智能化工具,可自动化、数据驱动地辅助或替代人工决策,广泛应用于金融、医疗、营销、风控等领域。文章阐述了决策引擎的核心功能,包括自动化决策、动态规则管理、实时处理和模型集成,以及系统组成,涵盖数据输入层、规则引擎和模型服务层。此外,还探讨了决策引擎的典型应用场景、技术架构、组件设计,以及风控决策引擎系统的技术方案、设计难点和重点。

庄小焱 3316

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

索引失效的几种场景

    在数据库SQL优化中,百分之80%的问题SQL都可以通过索引来解决,但是有时候我们也会碰到一种情况,明明索引都有,为什么MySQL没有选择走索引而是走了全表扫描呢?近期就碰到一个案例,同大家分析一个当时的解决思路以及对索引失效的几种情况总结一下~ 一、告警发现     在一个风和丽日的下午,突然一条高亮的钉钉信息抖动在为眼前。【尊敬的用户xxx,...

weixin_34023982的博客 1141

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

用了索引一定就有用吗?如何排查?

引言:在数据库优化中,索引是一个非常重要的话题。许多人都认为只要在查询字段上创建索引,查询就会变得更快,但实际情况并非总是如此。有时候,索引可能会失效,甚至导致查询变慢。因此,了解索引的使用情况以及如何排查索引失效是至关重要的。

2401_84419325的博客 905

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Oracle索引失效问题

Oracle 索引不起作用的几种情况: 1,<>2,单独的>,<,(有时会用到,有时不会)3,like "%_" 百分号在前.(可采用在建立索引时用reverse(columnName)这种方法处理)4,表没分析.5,单独引用复合索引里非第一位置的索引列.6,字符型字段为数字时在where条件里不添加引号.7,对索引列进行运算.需要建立函数索引.8,not in ,not...

weixin_30567225的博客 145

MySQL索引使用一定有效吗?如何排查索引效果?

即使你创建了索引,MySQL 也可能因为以下原因。

Uzumaki_Naruto12的博客 741

行锁升级表锁如何避免?表锁后如何排查?

InnoDB引擎3种行锁算法(Record Lock、Gap Lock、Next-key Lock)都是锁定的索引。当触发X锁(写锁)的where条件 无索引 或 索引失效 时,查询的方式就变成全表扫描,也就是扫描所有的聚集索引记录。

Jokers_lin的博客 2001

其他几个mysql面试常问问题

其他几个mysql面试常问问题

baidu_33164415的博客 90

告别MongoDB黑盒,金仓索引透明排查更高效

通过上述三步法,我们可以系统地排查并解决金仓数据库中索引未被使用的问题。相比于MongoDB中的hint()强制走索引的“黑盒”操作,金仓提供了透明的执行计划和可验证的统计信息,使得诊断过程更加直观和可控。在实际工作中,建议定期检查索引的使用情况和统计信息的有效性,及时进行优化调整。希望本文的方法能够帮助大家更好地管理和优化数据库性能,提升系统的整体表现。如果你有任何疑问或需要进一步的帮助,欢迎随时联系我哦!

augen1355的博客 774

记一次MySQL JOIN索引失效优化

MySQL JOIN查询ON,索引失效导致全表ALL扫描

正儿八经的胡说八道的博客 971

面试数据库八股文五问五答第四期

面试必备八股文!内容包含:Java基础、Java框架、Git命令、JVM、多线程、消息队列、微服务、Linux、数据库、Redis缓存、算法等等。

qq_67358181的博客 1008
上一篇: 假设数据库成为了性能瓶颈点,动态数据查询如何提升效率?
下一篇: 短 URL 生成器设计:百亿短 URL 怎样做到无冲突?
Java阿福
博客等级 码龄2年 61粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值