iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >索引使用规则及索引失效情况
  • 482
分享到

索引使用规则及索引失效情况

mysql 2023-09-05 09:09:00 482人浏览 安东尼
摘要

索引使用规则 联合索引索引失效情况 联合索引 1.最左前缀法则 如果索引使用了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列,如果

索引使用规则

联合索引

1.最左前缀法则
如果索引使用了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列,如果跳跃某一列,索引将会部分失效(后面字段的索引失效)。其中对于最左的列必须存在,否则索引将全部失效。

在这里插入图片描述
以tb_user为例,tb_user表所创建的索引如上图所示,在tb_user表中 ,id 为主键索引,phone,name为普通索引,还有一个联合索引,联合索引涉及到3个字段,顺序分别为profession,age,status。
最左原则就是在查询时,最左边的列,也就是profession必须存在,否则索引全部失效。而且中间不能跳过某一列,否则该列后面的字段将失效。用以下几组案例来演示:

EXPLaiN SELECT * FROM tb_user WHERE profession = '软件工程' and age = 31 and status = '0';

在这里插入图片描述

EXPLAIN SELECT * FROM tb_user WHERE profession = '软件工程' and age = 31 ;

在这里插入图片描述

EXPLAIN SELECT * FROM tb_user WHERE profession = '软件工程' ;

在这里插入图片描述
以上3组测试中,只要联合索引最左边的字段 profession存在,索引就会生效,只不过索引的长度不同,通过以上3组测试可以得出,profession字段索引长度36,age长度为2,status长度也为2.

EXPLAIN SELECT * FROM tb_user WHERE age = 31 and status  ='0' ;

在这里插入图片描述

EXPLAIN SELECT * FROM tb_user WHERE status  ='0' ;

在这里插入图片描述
通过上面2组测试看到索引并未生效,原因就是不满足最左前缀法则,联合索引最左边的列profession不存在。

EXPLAIN SELECT * FROM tb_user WHERE profession ='软件工程' and   status  ='0' ;

在这里插入图片描述
通过上面这组测试看到profession存在时索引生效,但是在查询时,跳过了age这个列,索引后面的列索引是不会使用的,也就是索引部分失效,索引索引的字段为36。

2.范围查询
在联合索引中,出现范围查询(>,<),范围右侧索引的列索引就失效。

EXPLAIN SELECT * FROM tb_user WHERE profession ='软件工程' and age >30  and   status  ='0' ;

在这里插入图片描述
当联合索引使用了范围查询(<,>),索引会生效,但是索引长度为38,就说明范围查询最右边的status字段是没有左索引的。当范围查询使用<= 或者 >=时,则右侧索引的列索引不会失效。

EXPLAIN SELECT * FROM tb_user WHERE profession ='软件工程' and age >=0  and   status  ='0' ;

在这里插入图片描述

索引失效情况

**1.不要在索引列上进行运算操作,索引将失效
在tb_user表中,其中phone字段也是一个索引。

当phone字段进行等值匹配时,索引生效。

EXPLAIN SELECT * FROM tb_user WHERE phone ='17799990017'

在这里插入图片描述

当phone字段进行函数运算操作之后,索引失效。

EXPLAIN SELECT * FROM tb_user WHERE SUBSTRING(phone ,10,2) = 15;

在这里插入图片描述
2.字符串类型字段使用时,不加引号,索引将失效

EXPLAIN SELECT * FROM tb_user WHERE phone = 17799990017

在这里插入图片描述
3.模糊查询
如果只是尾部模糊匹配,索引不会失效。如果是头部使用模糊匹配,索引失效。

尾部模糊匹配,索引不失效

EXPLAIN SELECT * FROM tb_user WHERE phone like '17111%'

在这里插入图片描述

头部模糊匹配,索引失效

EXPLAIN SELECT * FROM tb_user WHERE phone like '%17'

在这里插入图片描述
4.or连接条件
用or分割开的条件,如果or前的条件的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。

EXPLAIN SELECT * FROM tb_user WHERE  id =10 or age = 22;

在这里插入图片描述
由于age没有索引,所以即使id有索引,索引也会失效。

CREATE INDEX idx_user_age on tb_user(age);

我们可以对age字段建立索引,建立索引后再次执行以上sql语句,结果如下:
在这里插入图片描述
最终发现,当or连接的条件中,左右两侧都有索引时,索引才会生效。
5.不等于(!= 或者<>)索引失效

EXPLAIN SELECT * FROM tb_user WHERE phone <> '123' ;

在这里插入图片描述

EXPLAIN SELECT * FROM tb_user WHERE phone != '123' ;

在这里插入图片描述

6.数据分布影响
如果Mysql评估使用索引比全表更慢,则不使用索引。

EXPLAIN SELECT * FROM tb_user WHERE  phone > '17799990015' ;

在这里插入图片描述

EXPLAIN SELECT * FROM tb_user WHERE  phone > '17799990020' ;

在这里插入图片描述
通过以上2组SQL测试得到只是phone查询的值不同,最终的执行计划也完全不一样。这是为啥?
就是因为mysql在查询时,会评估使用索引的效率与走全表扫描的效率,如果走全表扫描更快,则会放弃索引,走全表扫描。因为索引是用来索引少量数据的,如果通过索引查询返回大批量的数据则还不如走全表扫描来的快,此时索引就会失效。

我们在看看 is null 与 is not null 操作是否走索引。

EXPLAIN SELECT * FROM tb_user WHERE  profession is null ;

在这里插入图片描述

EXPLAIN SELECT * FROM tb_user WHERE  profession is not  null ;

在这里插入图片描述
接下来,我们做一个操作profession字段值全部更新为null。

update  tb_user set profession = null ;

然后在执行以上2条sql,查看其执行计划
在这里插入图片描述
在这里插入图片描述
最终看到一模一样的SQL语句,先后执行了两次,结果查看执行计划是不一样的,为什么会出现这种情况呢?还是因为数据库的数据分布有关系。查询Mysql会评估,走索引快还是全表扫描快,如果全表扫描更快,则会放弃索引走全表扫描。因此,is null 、is not null是否走索引,得具体情况具体分析,并不是固定的。

来源地址:https://blog.csdn.net/Maringss/article/details/128193744

您可能感兴趣的文档:

--结束END--

本文标题: 索引使用规则及索引失效情况

本文链接: https://www.lsjlt.com/news/395104.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 索引使用规则及索引失效情况
    索引使用规则 联合索引索引失效情况 联合索引 1.最左前缀法则 如果索引使用了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列,如果...
    99+
    2023-09-05
    mysql
  • 情况导致MySQL索引失效
    MySQL索引失效的几种情况及代码示例 引言:在MySQL数据库中,索引是提高查询性能的重要因素之一。然而,有时候我们会发现索引并没有起到预期的作用,查询性能并没有得到提升,甚至还会导...
    99+
    2024-02-22
    索引选择不当 sql语句 mysql索引
  • mysql索引失效的几种情况
    常见情况:1、使用函数或运算;2、隐式类型转换;3、使用不等于(!=或);4、使用like操作符,并以通配符开头;5、or条件;6、null值;7、索引选择性低;8、复合索引的最左前缀原...
    99+
    2024-02-22
    mysql 索引失效 mysql索引 隐式类型转换
  • mysql引发索引失效的情况有哪些
    这篇文章主要讲解了“mysql引发索引失效的情况有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql引发索引失效的情况有哪些”吧!1、在查询条件中计算索引列的使用函数或操作。若已建...
    99+
    2023-06-20
  • SqlServer索引失效的情况有哪些
    表数据量过小或者分布不均匀,导致SQL Server查询优化器认为使用索引扫描的代价大于全表扫描,从而选择全表扫描而不是使用索引...
    99+
    2024-04-16
    SqlServer
  • innodb索引失效的情况有哪些
    数据量过大:当数据表中的数据量非常大时,索引可能会失效,因为MySQL可能会选择不使用索引而进行全表扫描,这样会导致查询性能下降...
    99+
    2024-03-14
    innodb
  • MySQL索引失效的情况有哪些
    这篇文章主要讲解了“MySQL索引失效的情况有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL索引失效的情况有哪些”吧!1.最左前缀原则在MySQL数据库中,联合索引遵守最左前缀...
    99+
    2023-07-05
  • SQL索引失效的情况有哪些
    这篇文章主要介绍了SQL索引失效的情况有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SQL索引失效的情况有哪些文章都会有所收获,下面我们一起来看看吧。数据库调优的大致方向:索引失效,没有充分利用到索引&a...
    99+
    2023-07-05
  • mysql索引什么情况下会失效
    mysql索引在不使用索引列进行查询、数据类型不匹配、前缀索引的使用不当、使用函数或表达式进行查询、索引列的顺序不正确、数据更新频繁和索引过多或过少情况下会失效。1、不使用索引列进行查询,为了避免这种情况,应该在查询中使用适当的索引列;2、...
    99+
    2023-08-09
  • oracle索引失效的情况有哪几种
    有以下几种情况可能导致Oracle索引失效:1. 索引列上的数据分布不均匀:如果索引列上的数据分布不均匀,即某些值出现的频率非常高,...
    99+
    2023-10-08
    oracle
  • SQL索引失效的11种情况详析
    目录索引失效案例【1】. 全值匹配【2】. 最佳左前缀法则【3】. 主键插入顺序【4】. 计算、函数、类型转换(自动或手动)导致索引失效【5】. 类型转换导致索引失效【6】. 范围条件右边的列索引失效【7】. 不等于(!...
    99+
    2023-03-09
    sql索引失效 sql如何加索引 怎么判断sql是否走索引
  • mysql索引失效的几种情况分析
    1、最佳左前缀原则——如果索引了多列,要遵守最左前缀原则。指的是查询要从索引的最左前列开始并且不跳过索引中的列。 前提条件:表中已添加复合索引(username,password,a...
    99+
    2024-04-02
  • 哪些情况会导致 MySQL 索引失效
    目录前言创建测试表和数据索引失效情况1:非最左匹配索引失效情况2:错误模糊查询索引失效情况3:列运算索引失效情况4:使用函数索引失效情况5:类型转换索引失效情况6:使用 is not...
    99+
    2024-04-02
  • 详解MySQL索引失效的几种情况
    MySQL索引是提高查询效率的重要手段。索引失效会导致查询效率下降,甚至全表扫描,影响数据库性能。以下是可能导致MySQL索引失效的情况: 1. 使用or操作符 当where语句中使用or操作符并且or两边的条件涉及到至少两个字段...
    99+
    2023-09-03
    数据库 mysql java
  • 索引失效的情况和解决方法
    1. 尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描 SELECT * FROM user WHERE name LIKE '%用%'​-- 优化方式:尽量在字段后面使用模糊查询SELECT * F...
    99+
    2023-09-16
    数据库 mysql java
  • MySQL索引失效的几种情况小结
    目录1.最左前缀原则2. 计算、函数使索引失效3. 类型转换导致索引失效4. 不等于(<>或!=)导致索引失效5. is not null /is null可能不走索引,也可以走索引6. 模糊匹配Like以%...
    99+
    2023-03-20
    MySQL索引失效 数据库索引失效
  • sql索引的介绍及使用规则
    1.索引概述 1.1索引介绍 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高级查找算...
    99+
    2023-09-01
    sql 数据库 mysql
  • MySQL导致索引失效的情况有哪些
    本篇内容主要讲解“MySQL导致索引失效的情况有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL导致索引失效的情况有哪些”吧!一、准备工作首先准备两张表用于演示:CREATE&nbs...
    99+
    2023-07-02
  • oracle联合索引失效的情况有哪些
    以下是一些导致Oracle联合索引失效的情况: 数据分布不均匀:如果联合索引的列中的值分布不均匀,查询可能会导致索引失效。例如,...
    99+
    2023-10-25
    oracle
  • mysql中什么情况会导致索引失效
    这篇文章主要为大家展示了“mysql中什么情况会导致索引失效”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql中什么情况会导致索引失效”这篇文章吧。为了讲解以下索引内容,我们先建立一个临时...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作