2024 年你不懂使用了索引反而变慢如何排查你就 OUT 啦

可以用过 MySQL 的执行计划来查看索引是否有用 explain {SQL语句},主要观察几个点:

  • type(访问类型):这个属性显示了查询使用的访问方法,例如 ALLindexrange 等。当查询使用索引时,这个属性通常会显示为 indexrange ,表示查询使用了索引访问。如果这个值是 ALL ,则表示查询执行了全表扫描,没有使用索引。
  • key(使用的索引):这个属性显示了查询使用的索引,如果查询使用了索引,则会显示索引的名称。如果这个值是 NULL,则表示查询没有使用索引。
  • rows(扫描的行数):这个属性显示了查询扫描的行数,即查询返回的行数。如果这个值很大,可能表示查询执行了全表扫描,而不是使用了索引。

对于用了索引一定就有用吗这个问题,我们排查要从两方面入手,具体如下:

索引真的生效了吗?

索引失效的场景有很多,也是面试官经常喜欢问的,可以根据具体场景进行排查,具体场景可以分为以下几点:

1)使用了联合索引却不符合最左前缀

举个例子:小鱼对 user 表建立了一个联合索引为 name_age_id 的联合索引,但是呢当他使用 SQL 查询的时候却是这样写的,select * where from age = 10 and id = 1; 这样的写法恰恰不满足最左前缀原则,索引就失效啦。

2)索引中使用了运算

举个例子:小鱼今天突发奇想,我试试新花样我直接在查询条件上运算怎么样!,那么如下 SQL 诞生了 select * from user where id + 3 = 8,真是聪明反被聪明误啊,这样恰恰导致了索引失效了,因为这样会导致全表扫描计算 id 的值再进行比较。

3)索引上使用了函数也会失效

小鱼真的懒死了!它连一点代码都不想写都想交给 MySQL 给他处理问题,它使用了函数让 MySQL 给他转换字段大小写,于是他写出了这样的 SQL 语句 select * from user where LOWER(name) like 'cong%';,这样也会导致索引失效,索引参与了函数处理,会导致去全表扫描喔。

4) like 的随意使用

相信小鱼写查询的时候都很喜欢将 % 写在首位,如:select * from user where name like '%cong%'; 这种情况就会导致索引失效喔,因为索引是从左到右来进行排序查找的,你的占位符直接放在了最左边开头,那么就直接导致要使用全表扫描啦~

5)or 的随意使用。

小鱼在 user 建了一个索引 name ,他以为稳了!写下了以下 SQL :select * from user where name= 'cong' or age = 18; 正是如此也导致了索引失效。不难看出当使用了 or 关键字时要两边同时都拥有索引才会生效喔~还有一种特殊的情况使用了 < 和 > 号也导致了索引失效因为是 or 使用了范围查询喔,例子如下:select * from user where age > 1 or age < 18;

6)随意的字段类型使用

粗心的小鱼将原本是 varchar 类型的 name 条件匹配了 int 类型字段,SQL 是这样的 select * from user where name = 1;,在代码中涉及 隐式转换 !将原本是 int 类型的 1 转成了 varchar 类型,这种情况也是不走索引的喔。

7)不同的参数也会导致索引失效

这个可能有点难以理解,具体 SQL 为 select * from user where age > 18;select * from user where age > 180; 根据数据量的不同,你有可能会发现前面那条走了索引而后面的却没走。这是因为当 MySQL 发现当使用了索引还不如直接全表扫描效率高,因此它会直接让索引失效。

8)表中两个不同字段进行比较

有天小鱼写了一条这样的 SQL :select * from user where id > age; ,小鱼他竟然将 idage 字段做了比较,好家伙!索引失效!

9)使用了 != 、<>

小鱼写的 SQL :select * from user where name != 'cong' ,可能会导致索引失效,这个场景下的 SQL 是否失效是根据查询到的数据集决定的,当数据大了的时候可能会导致索引失效。

10)使用了 is not null

注意使用了 is not null 会直接导致失效,而使用 is null 则不会。因为当使用 is not null 条件时,数据库系统需要扫描整个索引,找出所有不为 null 的值,这可能会导致索引失效。使用 is null条件不会导致索引失效,因为对于索引而言,查找 null 值的行与查找其他任何特定值的行都没有本质区别。在大多数情况下,null 值都会被索引包括在内。

11)使用了 order by

order by 后面跟的 不是主键 或者 不是覆盖索引 会导致不走索引。

为什么索引生效了反而查询变慢了呢?

1)索引也是需要占空间的。当数据少的时候,建立了多个索引反而会导致查询速度没效果反而更慢。

2)对大字段建立了索引。小鱼给 text 字段建立了索引导致查询需要扫描更多的数据块,反而变慢。

3)对重复值较多的字段建立索引。今天小鱼给性别字段建立了索引,他发现怎么查询还变满了!索引列的一些值重复度非常高,那么查询可能会导致大量的磁盘I/O操作,从而导致查询变慢。

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

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

相关文章

智慧农场系统应该具有哪些模块

传感器网络模块&#xff1a;通过在农田、设施、养殖场等关键位置布置各种传感器&#xff0c;如土壤湿度传感器、温度传感器、光照强度传感器、空气湿度传感器、二氧化碳浓度传感器等&#xff0c;实现对环境参数的实时监测和数据采集。数据采集与传输模块&#xff1a;该模块负责…

JS各种概念

/纯函数&#xff08;Pure Function&#xff09;&#xff1a;一个纯函数的输出只取决于输入参数&#xff0c;不会改变任何外部状态或产生副作用。 // 纯函数示例function add(a, b) {return a b;} 副作用&#xff08;Side Effect&#xff09;&#xff1a;在函数执行期间对外部…

人大金仓数据库报com.kingbase8.util.KSQLException: 致命错误: 用户 “SYSTEM“ Password 认证失败

com.kingbase8.util.KSQLException: 致命错误: 用户 “SYSTEM” Password 认证失败 解决办法&#xff1a; 问题在于用户权限只不足&#xff0c;相关配置文件在一般在 /data/sys hba.conf,修改IPV4 local connections选项中的改为trust。

网络机顶盒哪个牌子好?经销商整理热门网络机顶盒排名

做实体数码店多年来&#xff0c;网络机顶盒这行我非常了解&#xff0c;各种品牌的网络机顶盒我们全销售过。近来很多朋友咨询我网络机顶盒哪个牌子好&#xff0c;我按照店内近一个季度的销量情况整理了是实体店最畅销的网络机顶盒排名&#xff0c;最受欢迎的品牌是以下这些&…

时钟模块RX8025SA 内置32.768 kHz石英晶体振荡器

实时时钟模块RX8025SA&#xff0c;料号Q41802552000100&#xff0c;是一款低功耗&#xff0c;高精度时钟芯片。时钟芯片RX8025SA选型过程中应该注意哪些&#xff1f;RX8025SA又应用在哪些领域呢&#xff1f;爱普生RTC实时时钟RX8025SA&#xff0c;内置32.768 kHz石英晶体振荡器…

泰山众筹:创新电商模式引领共赢新时代

一、泰山众筹模式概述 泰山众筹模式&#xff0c;作为一种创新型的电商策略&#xff0c;巧妙地将产品销售与积分众筹相结合&#xff0c;为用户和平台双方创造了互利共赢的机会。在此模式下&#xff0c;用户购买指定产品即可获得相应积分&#xff0c;进而可将这些积分投入到众筹…

python 项目如何生成 requirements.txt文件

在Python项目中生成requirements.txt文件是一个很好的实践&#xff0c;它可以帮助记录项目依赖&#xff0c;便于他人复现环境或部署应用。以下是几种常见的生成方法&#xff1a; 使用pip 安装所有依赖: 确保你的项目环境中已经安装了所有需要的包。 生成requirements.txt: 在…

AI换脸原理(2)——人脸检测参考文献S3FD:源码解析

1 介绍 S3FD是一个实时人脸检测器,这篇论文的主要思想是试图解决一个常见的问题,即基于anchor(锚点)的检测器随着人脸变小而急剧恶化。 基于锚点的目标检测方法是通过对一系列预设锚点进行分类和回归来检测目标的,这些锚点是通过在图像上有规律地平铺一组不同尺度和宽高比…

怎么快速分享视频文件?用二维码看视频的方法

怎样不通过传输下载分享视频内容呢&#xff1f;以前分享视频内容&#xff0c;大多会通过微信、QQ、邮箱、网盘等形式来传递。但是这种方式需要下载后才可以观看&#xff0c;不仅占用手机内存&#xff0c;而且效率也比较低&#xff0c;所以现在很多人会采用视频生成二维码的方式…

MBTI与职业规划:找到最适合你的职业道路(包含开源免费的API)

MBTI简介 MBTI是根据荣格的心理类型理论著成&#xff0c;已经成为权威的性格测试。 MBTI&#xff08;Myers-Briggs Type Indicator&#xff09;&#xff0c;是一种迫选型、自我报告式的性格评估测试&#xff0c;用以衡量和描述人们在获取信息、作出决策、对待生活等方面的心理…

初学C++——C++基础、变量、字面量、常量、数据类型、类型转换、变量命名规则、开发环境配置

文章目录 简介C 语言的特性C 开发环境配置C 变量&#xff0c;字面量和常量C 变量变量命名规则 C 字面量C 常量 C 数据类型C 基本数据类型派生数据类型 C 类型转换隐式类型转换C 显式转换 简介 C 是一种静态类型的&#xff0c;自由形式的&#xff08;通常&#xff09;编译的&…

git commit后发现git pull 拉取代码失败的解决方案(致命错误:需要指定如何调和偏离的分支。)

文章目录 前言一、情况复现1.以前多人开发同一分支提交代码逻辑(下拉取后提交)2.报错 二、解决方案1. 撤销最近一次提交2.提交代码3.注意点&#xff1a;常用的 git stash 命令&#xff1a; 前言 人员张三和人员李四在同一分支&#xff08;dev&#xff09;上开发 一、情况复现 …

springboot中使用fastJson返回前端数据出现$ref处理

出现场景&#xff1a; 一个返回对象中的多个属性集合相同 如&#xff1a;下图中的tips和geocodes的对象相同&#xff0c;反参给前端数据结构会出现下面情况 解决方案 在一个集合中&#xff0c;循环给这个对象赋值会出现"$ref":" $ [0]"&#xff0c;它会认…

代码随想录算法训练营第四十二天| 01背包问题理论基础,416. 分割等和子集

理论基础&#xff1a; 带你学透0-1背包问题&#xff01;| 关于背包问题&#xff0c;你不清楚的地方&#xff0c;这里都讲了&#xff01;| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili很多同学对背包问题的理解程度都处于一种黑盒的状态&#xff0c;及时这道题目在力…

现在学plc有前途吗?要怎么学习plc,有什么要求?

当然有前途 PLC 是以传统顺序控制器为基础&#xff0c;综合了计算机技术、微电子技术、自动控制技术、数字技术和通信网络技术而形成的新型通用工业自动控制装置&#xff0c;是一种数字运算操作的电子系统&#xff0c;专为在工业环境下应用而设计。 目前&#xff0c;PLC 在国…

47. UE5 RPG 实现角色死亡效果

在上一篇文章中&#xff0c;我们实现了敌人受到攻击后会播放受击动画&#xff0c;并且还给角色设置了受击标签。并在角色受击时&#xff0c;在角色身上挂上受击标签&#xff0c;在c里&#xff0c;如果挂载了此标签&#xff0c;速度将降为0 。 受击有了&#xff0c;接下来我们将…

CSS选择器(基本+复合+伪类)

目录 CSS选择器 基本选择器 标签选择器&#xff1a;使用标签名作为选择器->选中同名标签设置样式 类选择器&#xff1a;给类选择器定义一个名字.类名&#xff0c;并给标签添加class"类名" id选择器&#xff1a;跟类选择器非常相似&#xff0c;给id选择器定义…

设计模式——适配器模式(Adapter)

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;主要用于将一个类的接口转换成客户端所期望的另一种接口&#xff0c;从而使得原本因接口不兼容而无法一起工作的类能够协同工作。 适配器模式主要解决两类问题&#xff1a; 类的接口不兼容…

QT day2 作业

头文件 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include <QDebug> #include<QIcon> #include<QLabel> #include<QMovie> #include<QLineEdit> #include<QPushButton> QT_BEGIN_NAMESPACE namespace Ui { class …

亲测idea打包java项目jar包+运行jar包

文章目录 配置运行jar包 配置 1、文件 -> 项目结构 2、工件 -> -> JAR -> 来自具有依赖项的模块... 3、选择文件路径 4、构建 -> 构建工件 5、选择工件进行构建 6、项目目录中会生成out目录&#xff0c;jar在里面 运行jar包 java -jar xxx.jar 默认…