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

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_ageenrollment_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 ININ的失效场景相同)。
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 为 nullextra = Using where 此时是索引失效了

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

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

 ……

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

相关推荐

索引失效如何排查

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

学无止境 3863

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

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

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

Qwen-Image(阿里通义千问)技术浅析(一)

Qwen-Image(阿里通义千问多模态模型)是阿里巴巴推出的视觉-语言多模态大模型,能够理解图像内容并完成复杂的跨模态任务。

m0_75253143的博客 647

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

mysql索引优化

sy_white的博客 8万+

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

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

qq_63815371的博客 3万+

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

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

killvoon的专栏 4765

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

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

jingjing45678的博客 1015

一文总结常见项目排查

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

xyliiiiiL的博客 911

索引失效的几种场景

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

weixin_34023982的博客 1136

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

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

2401_84419325的博客 901

Oracle索引失效问题

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

weixin_30567225的博客 143

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

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

Uzumaki_Naruto12的博客 736

索引失效的七种情况

以上这些情况都可能导致数据库查询时无法有效地使用索引,从而影响查询性能。为了避免索引失效,需要优化查询语句,合理设计索引,尽量避免上述情况的出现。

Ecloss 1万+

索引失效的7个原因

实际工作以及面试中,应该经常会遇到SQL相关的问题,而这些问题中,索引失效的场景又是一个常客。下面总结一下索引失效的场景,一共7种,索引失效的原因逃不过这7个。

王飞的博客 1万+

索引失效的10种场景

当。

weixin_55076626的博客 1万+

MySQL索引失效的12种场景及解决方案

索引优化是一个持续的过程,需要结合具体的业务场景和数据特点。通过了解这些索引失效的场景和原理,你可以更有针对性地设计索引策略,显著提升数据库性能。没有一劳永逸的索引方案,随着数据量的增长和业务的变化,索引策略也需要不断调整和优化。持续监控、分析和优化是保持高性能数据库的关键。

风象南的专栏 4100

5.索引失效的原因(11种情况,详讲)

索引失效的原因情况,最左匹配原则,一般性建议: ●对于单列索引,尽量选择针对当前query过滤性更好的索引 ●在选择组合索引的时候,当前query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。 ●在选择组合索引的时候,尽量选择能够包含当前query中的where子句中更多字段的索引。 ●在选择组合索引的时候,如果某个字段可能出现范围查询时,尽量把这个字段放在索引次序的最后面。 总之,书写SQL语句时,尽量避免造成索引失效情况

sakura 4841

代码复现1——Matterport3d数据集下载

进入“Dataset Download”部分,下载申请书,填写之后发送到指定邮箱(matterport3d@googlegroups.com),之后会收到回信,回信中附有一个download_mp.py的脚本文件。,大小约15G,并不是所有的Mp3d datasets,所有大小约1.3T。下载完成后如下图所示:我这边显示大小为16.1G。

qq_44100524的博客 7950

最新11月功能强大的社区论坛整站源码 论坛社区系统网站源码.zip

最新论坛社区系统网站源码 | 集成在线商城、知识付费、拓客广告等多功能于一体这是一款功能强大、高度集成的社区论坛网站源码,专为构建多元化、高互动性的在线社区平台而设计。系统插件丰富,配备精美PC端模板,支持全场景应用,轻松打造专属的社交生态。核心功能亮点:知识付费:支持课程、文档、资源等内容的付费下载与会员订阅在线商城:内置电商模块,实现商品发布、交易与订单管理社区论坛:完善的发帖、回帖、版块管理、话题分类机制在线课程:打造专属教育平台,支持视频、图文课程发布圈子社交:支持用户创建兴趣圈子,实现精准社群运营交友互动:私信、关注、动态分享,增强用户粘性微信投票:灵活创建投票活动,提升用户参与度拓客广告系统:集成推广与广告位管理,助力流量变现

上一篇: 假设数据库成为了性能瓶颈点,动态数据查询如何提升效率?
下一篇: 短 URL 生成器设计:百亿短 URL 怎样做到无冲突?
Java阿福
博客等级 码龄1年 61粉丝 14原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值