java八股文面试[数据库]——索引哪些情况下会失效

news2025/1/9 2:11:58
  1. 查询条件包含 or,会导致索引失效。

  2. 隐式类型转换,会导致索引失效,例如 id字段类型是varchar,我们 where id = 1,这样就会触发隐式类型转换

  3. like 通配符会导致索引失效,注意:”ABC%” 不会失效,会走 range 索引,”% ABC” 索引会失效

  4. 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。

  5. 对索引字段进行函数运算

  6. 对索引列运算(如,+、-、*、/),索引失效。

  7. 索引字段上使用(!= 或者 < >,not in)时,会导致索引失效。

  8. 索引字段上使用 is null, is not null,not exist 可能导致索引失效。

  9. 相 join 的两个表的字符编码不同,不能命中索引,会导致笛卡尔积的循环计算

  10. mysql 估计使用全表扫描要比使用索引快,则不使用索引。

知识速记:or like null  不等于 联合最左 类型 函数 运算  编码 全表

类型转换

MySQL 在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较

select * from t_user where phone = 1300000001;

这是因为 phone 字段为字符串,所以 MySQL 要会自动把字符串转为数字,所以这条语句相当于:

select * from t_user where CAST(phone AS signed int) = 1300000001;

可以看到,CAST 函数是作用在了 phone 字段,而 phone 字段是索引,也就是对索引使用了函数!而前面我们也说了,对索引使用函数是会导致索引失效的

例子二中的查询语句,我跟大家说了是会走索引扫描:

//例子二的查询语句
select * from t_user where id = "1";

这时因为字符串部分是输入参数,也就需要将字符串转为数字,所以这条语句相当于:

select * from t_user where id = CAST("1" AS signed int);

可以看到,索引字段并没有用任何函数,CAST 函数是用在了输入参数,因此是可以走索引扫描的

联合索引使用了select *

KEY `union_idx` (`id_no`,`username`,`age`)

比如,在上面的联合索引中,如果查询条件是age或username,当使用了select * ,肯定是不会走索引的。

但如果希望根据username查询出id_no、username、age这三个结果(均为索引字段),明确查询结果字段,是可以走覆盖索引的:

explain select id_no, username, age from t_user where username = 'Tom2';
explain select id_no, username, age from t_user where age = 12;

explain结果:

无论查询条件是username还是age,都走了索引,根据key_len可以看出使用了索引的所有列。

第二种索引失效场景:在联合索引下,尽量使用明确的查询列来趋向于走覆盖索引

如果or两边同时使用“>”和“<”,则索引也会失效:
explain select * from t_user where id  > 1 or id  < 80;

explain结果:

查询条件使用or关键字,其中一个字段没有创建索引,则会导致整个查询语句索引失效;

or两边为“>”和“<”范围查询时,索引失效。

两列做比较

如果两个列数据都有索引,但在查询条件中对两列数据进行了对比操作,则会导致索引失效。

这里举个不恰当的示例,比如age小于id这样的两列(真实场景可能是两列同维度的数据比较,这里迁就现有表结构):

explain select * from t_user where id > age;

explain结果:

这里虽然id有索引,age也可以创建索引,但当两列做比较时,索引还是会失效的。

两列数据做比较,即便两列都创建了索引,索引也会失效

不等于比较

示例:

explain select * from t_user where id_no <> '1002';

explain结果:

当查询条件为字符串时,使用”<>“或”!=“作为条件查询,有可能不走索引,但也不全是

explain select * from t_user where create_time != '2022-02-27 09:56:42';

上述SQL中,由于“2022-02-27 09:56:42”是存储过程在同一秒生成的,大量数据是这个时间。执行之后会发现,当查询结果集占比比较小时,会走索引,占比比较大时不会走索引。此处与结果集与总体的占比有关。

需要注意的是:上述语句如果是id进行不等操作,则正常走索引。

explain select * from t_user where id != 2;

explain结果:

查询条件使用不等进行比较时,需要慎重,普通索引会查询结果集占比较大时索引会失效

is not null

示例:

explain select * from t_user where id_no is not null;

explain结果:

查询条件使用is null时正常走索引,使用is not null时,不走索引。

not in和not exists

在日常中使用比较多的范围查询有in、exists、not in、not exists、between and等。

explain select * from t_user where id in (2,3);
​
explain select * from t_user where id_no in ('1001','1002');
​
explain select * from t_user u1 where exists (select 1 from t_user u2 where u2.id  = 2 and u2.id = u1.id);
​
explain select * from t_user where id_no between '1002' and '1003';

上述四种语句执行时都会正常走索引,具体的explain结果就不再展示。主要看不走索引的情况:

explain select * from t_user where id_no not in('1002' , '1003');

explain结果:

当使用not in时,不走索引?把条件列换成主键试试:

explain select * from t_user where id not in (2,3);

explain结果:

如果是主键,则正常走索引。

查询条件使用not in时,如果是主键则走索引,如果是普通索引,则索引失效

再来看看not exists

explain select * from t_user u1 where not exists (select 1 from t_user u2 where u2.id  = 2 and u2.id = u1.id);

explain结果:

当查询条件使用not exists,不走索引。

查询条件使用not exists时,索引失效

order by导致索引失效

示例:

explain select * from t_user order by id_no ;

explain结果:

其实这种情况的索引失效很容易理解,毕竟需要对全表数据进行排序处理

那么,添加删limit关键字是否就走索引了呢?

explain select * from t_user order by id_no limit 10;

explain结果:

结果依旧不走索引。在网络上看到有说如果order by条件满足最左匹配则会正常走索引, 在当前8.0.18版本中并未出现。所以,在基于order bylimit进行使用时,要特别留意。是否走索引不仅涉及到数据库版本,还要看Mysql优化器是如何处理的。

这里还有一个特例,就是主键使用order by时,可以正常走索引

explain select * from t_user order by id desc;

explain结果:

可以看出针对主键,还是order by可以正常走索引。

另外,笔者测试如下SQL语句:

explain select id from t_user order by age;
explain select id , username from t_user order by age;
explain select id_no from t_user order by id_no;

上述三条SQL语句都是走索引的,也就是说覆盖索引的场景也是可以正常走索引的。

现在将idid_no组合起来进行order by

explain select * from t_user order by id,id_no desc;
explain select * from t_user order by id,id_no desc limit 10;
explain select * from t_user order by id_no desc,username desc;

explain结果:

上述两个SQL语句,都未走索引。

当查询条件涉及到order by、limit等条件时,是否走索引情况比较复杂,而且与Mysql版本有关,通常普通索引,如果未使用limit,则不会走索引。order by多个索引字段时,可能不会走索引。其他情况,建议在使用时进行expain验证。

知识来源:马士兵教育

盘一盘常见的6种索引失效情况 - 知乎

15个必知的Mysql索引失效场景,别再踩坑了! - 知乎

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

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

相关文章

问道管理:华为产业链股再度拉升,捷荣技术6连板,华力创通3日大涨近70%

华为产业链股6日盘中再度拉升&#xff0c;到发稿&#xff0c;捷荣技能涨停斩获6连板&#xff0c;华映科技亦涨停收成3连板&#xff0c;华力创通大涨超19%&#xff0c;蓝箭电子涨约11%&#xff0c;力源信息涨超4%。 捷荣技能盘中再度涨停&#xff0c;近7日已累计大涨超90%。公司…

如何成为一个高效的电商数据分析师

如何成为一个高效的电商数据分析师 文章目录 如何成为一个高效的电商数据分析师前言市场洞察平台品类品牌淘天京东抖音 商品 总结 前言 电商数据分析师 在我看来这个角色的定义其实很宽泛&#xff0c;现在从事电商这门生意的人都可以是&#xff0c;而且应该是一名电商数据分析师…

[BSidesCF 2019]Kookie 1 , cookie伪造

给了一个用户和密码 用户名&#xff1a;cookie 密码&#xff1a;monster 登录后查看cookie 发现就是用户名维持登录 那么修改用户名为 admin 得到flag

原型-设计模式

原型设计模式 原型模式应用场景&#xff1a;创建一个对象比较复杂&#xff0c;当前存在一个和需要创建的对象极其相似&#xff0c;我们就可以采用原型模式&#xff0c;在原来的对象上进行一个修改。 修改方案&#xff1a;在原来的基础上进行拷贝&#xff0c;在进行部分的修改。…

Pytest系列-快速入门和基础讲解(1)

前言 目前有两种纯测试的测试框架&#xff0c;pytest和unittestunittest应该是广为人知&#xff0c;而且也是老框架了&#xff0c;很多人都用来做自动化&#xff0c;无论是UI还是接口pytest是基于unittest开发的另一款更高级更好用的单元测试框架 单元测试框架介绍 单元测试…

【Arduino24】8*8点阵实验

硬件准备 8*8点阵&#xff1a;1个 旋钮电位器&#xff1a;1个 面包板&#xff1a;1块 杜邦线&#xff1a;若干 硬件连线 软件程序 //定义引脚 #define xKnob_pin A0 //x轴旋钮的引脚 #define yKnob_pin A1 //y轴旋钮的引脚 const int row_pin[8] { 6, 11, 10, 3, 17, 4…

Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

playwright 录制脚本执行时出现文件编码错误 SyntaxError

playwright 录制脚本执行时出现文件编码错误 SyntaxError 问题描述&#xff1a; 使用playwright 进行脚本录制&#xff0c;录制的过程中&#xff0c;某些元素的定位方式由中文确认&#xff0c;脚本录制完成后&#xff0c;执行脚本报错&#xff0c;出现 SyntaxError: (unicode e…

无涯教程-JavaScript - BESSELK函数

描述 BESSELK函数返回修改后的Bessel函数Kn(x),该函数等效于针对纯虚参判断的Bessel函数。 这些也称为双曲贝塞尔函数。 语法 BESSELK(X, N)争论 Argument描述Required/OptionalXThe value at which to evaluate the function.RequiredNThe order of the function. If n i…

Docker实战:docker compose 搭建Sonar

1、docker-compose-sonar文件准备 进入/home/docker目录&#xff0c;新建docker-compose-sonar.yml文件&#xff0c;内容如下&#xff1a; version: 3 services: sonar:image: sonarqube:8.9.6-communityrestart: always container_name: sonarqubevolumes:# 设置与宿主机时间…

string容器的常用操作

string容器的常用操作 一、C语言中的字符串二、string容器1、概念2、特点 三、string类对象的常见构造1、构造2、实际构造函数3、测试代码4、运行结果 四、赋值运算符1、类型2、作用3、测试代码4、运行结果 五、string类对象的容量操作1、成员函数2、测试代码3、说明4、运行结果…

第二十章 ObjectScript - 潜在的缺陷

文章目录 第二十章 ObjectScript - 潜在的缺陷 第二十章 ObjectScript - 潜在的缺陷 以下项目可能会让刚接触ObjectScript的程序员感到困惑&#xff0c;特别是那些负责维护其他程序员编写的代码的程序员: 在例程或方法中&#xff0c;除非每行包含标签&#xff0c;否则每行必须…

复制粘贴是怎么实现的

在上面的代码中&#xff0c;command 和 select 是自定义的函数。它们的作用如下&#xff1a; 实现复制粘贴的思路&#xff1a; 创建一个 textarea 标签将 textarea 移出可视区域给这个 textarea 赋值将这个 textarea 标签添加到页面中调用 textarea 的 select 方法调用 docum…

【PowerDesigner16】显示工具面板

1、点击左上角【工具】“toolbars”&#xff0c;然后【自定义工具栏】&#xff0c;选择“palette”即可显示工具栏。

MediaCodec源码分析 createByCodecName流程

前言 本文梳理MediaCodec初始化流程,即create流程,基于7.0代码。流程图如下,创建流程还是比较清晰简单的。 代码见: frameworks/base/media/java/android/media/MediaCodec.java frameworks/base/media/jni/android_media_MediaCodec.h frameworks/base/media/jni/androi…

源代码防泄密

IBM 发布年度《数据泄露成本报告》&#xff0c;显示 2023 年全球数据泄露平均成本达到 445 万美元&#xff0c;比过去 3 年增加了 15%。创下该报告的历史新高。 报告显示&#xff0c;企业在计划如何应对日益增长的数据泄露频率和成本方面存在分歧。研究发现&#xff0c;虽然 95…

Debian12系统下LAMP环境中Nubuilder4.5的安装

一、环境搭建 按照官方的说法&#xff0c;Apache2和Nginx都可以的&#xff0c;实际上&#xff0c;你最好直接按照 Mariadb\Apache2\Php8.2 这个顺序&#xff0c;搭建LAMP环境较好。不然各种调试&#xff0c;还不一定能够成功。 相关搭建方法&#xff0c;属于一般操作&#xf…

Python关键字(保留字)一览表

保留字是 Python 语言中一些已经被赋予特定意义的单词&#xff0c;这就要求开发者在开发程序时&#xff0c;不能用这些保留字作为标识符给变量、函数、类、模板以及其他对象命名。 Python 包含的保留字可以执行如下命令进行查看&#xff1a; >>> import keyword >…

刷题笔记16——数组的花式输出

华容道 听到面试的时候会问到华容道的问题&#xff0c;简单记录一下&#xff0c;也类似于迷宫问题&#xff0c;可以记录下空格地方所在的位置&#xff0c;华容道问题就类似于空格在整个数组中寻找一条路线&#xff08;无论我们如何移动小块&#xff0c;其实都是空格以一条路线…

ActiveReportsJs 账票印刷

参考资料 官方文档 一. HTML部分 在页面上添加了Loading效果&#xff0c;账票印刷开始时显示Loading效果&#xff0c;印刷结束后隐藏Loading效果。ar-js-core.js是核心文件ar-js-pdf.js用来印刷PDFar-js-xlsx.js用来印刷EXCELar-js-locales.js用来设置语言 <!DOCTYPE htm…