MySQL中的索引失效情况介绍

        MySQL中的索引是提高查询性能的重要工具。然而,在某些情况下,索引可能无法发挥作用,甚至导致查询性能下降。在本教程中,我们将探讨MySQL中常见的索引失效情况,以及它们的特点和简单的例子。


        1. **索引失效的情况**
         **索引列参与计算**
当查询中的索引列参与了计算或函数时,索引将失效。例如,如果查询包含`YEAR(date_column)`函数,则无法使用`date_column`上的索引。
**例子**:


SELECT * FROM orders WHERE YEAR(order_date) = 2021;


在这个例子中,索引`order_date`不会被使用,因为`YEAR`函数已经对日期列进行了计算。
        1.2 **索引列排序与查询列顺序不一致**
当查询中的列顺序与索引列的顺序不一致时,索引可能不会被使用。MySQL优化器可能会决定使用全表扫描而不是索引扫描。
**例子**:


SELECT order_date, customer_id FROM orders WHERE customer_id = 123;


在这个例子中,索引`idx_customer_id`(包含`customer_id`和`order_date`)不会被使用,因为查询列的顺序与索引列的顺序不一致。
        1.3 **使用不等操作符(<>、!=、<、>、<=、>=)**
当查询使用不等操作符时,索引可能不会被使用。特别是当查询条件包含多个不等操作符时,索引的使用可能性更小。
**例子**:


SELECT * FROM orders WHERE customer_id <> 123 AND order_date > '2021-01-01';


在这个例子中,由于查询条件包含多个不等操作符,索引`idx_customer_id`和`idx_order_date`可能不会被使用。
        1.4 **使用OR操作符**
当查询条件包含OR操作符时,索引的使用取决于查询中使用的列是否都包含在索引中。如果查询中的列都包含在索引中,索引可能仍然会被使用。
**例子**:


SELECT * FROM orders WHERE customer_id = 123 OR order_date > '2021-01-01';


在这个例子中,如果索引`idx_customer_id`和`idx_order_date`都包含在索引中,则索引可能会被使用。
        1.5 **使用LIKE操作符**
当查询使用LIKE操作符时,索引的使用取决于LIKE操作符的位置和模式。如果LIKE操作符位于查询的开始位置,则索引不会被使用。
**例子**:


SELECT * FROM orders WHERE order_date LIKE '2021%';


在这个例子中,由于LIKE操作符位于查询的开始位置,索引`idx_order_date`不会被使用。
        1.6 **使用覆盖索引**
覆盖索引是指查询只需要从索引中获取数据,而不需要读取实际的行数据。如果查询无法完全从索引中获取所需数据,则覆盖索引将失效。
**例子**:


SELECT customer_id FROM orders WHERE order_date > '2021-01-01';


在这个例子中,虽然查询只需要`customer_id`列,但由于查询条件`order_date`不在索引列中,因此无法使用覆盖索引。
        1.7 **索引列类型与查询条件类型不匹配**
当索引列的数据类型与查询条件的数据类型不匹配时,索引可能不会被使用。
**例子**:


SELECT * FROM orders WHERE VARCHAR_FORMAT(order_date, '%Y') = '2021';


在这个例子中,由于`VARCHAR_FORMAT`函数改变了索引列`order_date`的数据类型,索引将不会被使用。
        1.8 **索引列被覆盖**
当查询中的列完全包含在另一个索引列中时,索引可能不会被使用。
**例子**:


SELECT customer_id, order_date FROM orders WHERE customer_id = 123;


在这个例子中,索引`idx_customer_id`不会被使用,因为查询中的`customer_id`和`order_date`列都包含在索引`idx_customer_id`中,且查询只使用了`customer_id`列。
        1.9 **使用非等价条件**
当查询中的条件不是精确匹配(即不是=、IN、<=>)时,索引可能不会被使用。
**例子**:


SELECT * FROM orders WHERE customer_id BETWEEN 123 AND 456;


在这个例子中,由于使用了`BETWEEN`条件,索引`idx_customer_id`可能不会被使用。
        1.10 **索引选择性低**
当索引的选择性低时,即索引包含大量重复的值,索引可能不会被使用。
**例子**:


SELECT * FROM orders WHERE customer_id = 1;


在这个例子中,如果`customer_id`列有大量的重复值,索引`idx_customer_id`可能不会被使用。
        1.11 **索引无法覆盖查询的所有列**
当查询需要的数据无法完全从索引中获取时,索引可能不会被使用。
**例子**:


SELECT order_date, customer_id FROM orders WHERE customer_id = 123;


在这个例子中,索引`idx_customer_id`(只包含`customer_id`)无法覆盖查询中的`order_date`列,因此索引可能不会被使用。
        1.12 **使用不等操作符与函数结合**
当查询中的不等操作符与函数结合使用时,索引可能不会被使用。
**例子**:


SELECT * FROM orders WHERE HOUR(order_date) < 12;


在这个例子中,由于使用了`HOUR`函数与不等操作符结合,索引`idx_order_date`可能不会被使用。
        1.13 **使用聚合函数**
当查询中使用了聚合函数时,索引可能不会被使用。
**例子**:


SELECT COUNT(*) FROM orders WHERE customer_id = 123;


在这个例子中,由于使用了`COUNT`聚合函数,索引`idx_customer_id`可能不会被使用。
        1.14 **使用GROUP BY或DISTINCT**
当查询中使用了GROUP BY或DISTINCT操作符时,索引可能不会被使用。
**例子**:


SELECT DISTINCT customer_id FROM orders;


在这个例子中,由于使用了`DISTINCT`操作符,索引`idx_customer_id`可能不会被使用。
        1.15 **使用子查询**
当查询中使用了子查询时,索引的使用取决于子查询的执行方式和数据来源。
**例子**:


SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM customers WHERE name = 'John');


在这个例子中,如果子查询的结果集较大,索引`idx_customer_id`可能不会被使用。
        2. **总结**
        MySQL中的索引失效情况有很多种,以上只是列举了一些常见的情况。了解这些情况可以帮助我们更好地理解和优化查询性能。在实际应用中,我们需要根据具体情况进行分析和调整,以充分发挥索引的优势。同时,也要注意避免索引失效的情况,提高查询效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码算法训练营day9 | 28. 实现 strStr() 、459.重复的子字符串

day9&#xff1a; 28. 实现 strStr()KMP的主要应用&#xff1a;什么是前缀表&#xff1a;前缀表是如何记录的&#xff1a; 如何计算前缀表&#xff1a;构造next数组&#xff1a;1、初始化2、处理前后缀不相同的情况3、处理前后缀相同的情况 代码&#xff1a; 459.重复的子字符串…

Python入门(三)

序列 序列是有顺序的数据集合。序列包含的一个数据被称为元素&#xff0c;序列可以由一个或多个元素组成&#xff0c;也是可以没有任何元素的空序列。 序列的类型 元组&#xff08;定值表&#xff09;&#xff1a;一旦建立&#xff0c;各个元素不可再更变&#xff0c;所以一…

Linux文件操作

pwd命令 cd命令 ls命令 mkdir命令 同时创建父子目录 cp命令 mv命令&#xff08;相当于用cp复制之后&#xff0c;把源文件删除&#xff09; 用mv命令来冲命令 rm命令 可以看到&#xff0c;我们用当前目录的文件覆盖了目标路径上的文件&#xff0c;并且目标路径中多了一个以波浪…

5 张图带你了解分布式事务 Saga 模式中的状态机

大家好&#xff0c;我是君哥。 状态机在我们的工作中应用非常广泛&#xff0c;今天聊一聊分布式事务中间件 Seata 中 Saga 模式的状态机。 1 状态机简介 状态机是一个数学模型&#xff0c;它将工作中的运行状态和流转规则抽象出来&#xff0c;可以协调相关信号来完成预先设定…

构造-析构-拷贝构造-赋值运算符重载-const成员函数

1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么时候都不写时&#xff0c;编译器会自动生成以下6个成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…

C++之deque与vector、list对比分析

一.deque讲解 对于vector和list&#xff0c;前一个是顺序表&#xff0c;后一个是带头双向循环链表&#xff0c;前面我们已经实现过&#xff0c;这里就不再讲解了&#xff0c;直接上deque了。 deque&#xff1a;双端队列 常见接口大家可以查看下面链接&#xff1a; deque - …

STM32第九节(中级篇):RCC(第一节)——时钟树讲解

目录 前言 STM32第九节&#xff08;中级篇&#xff09;&#xff1a;RCC——时钟树讲解 时钟树主系统时钟讲解 HSE时钟 HSI时钟 锁相环时钟 系统时钟 SW位控制 HCLK时钟 PCLKI时钟 PCLK2时钟 RTC时钟 MCO时钟输出 6.2.7时钟安全系统(CSS&#xff09; 小结 前言 从…

单链表操作

单链表操作 1. 链表的概念2. 链表的分类2.1.单向或者双向2.2 带头或者不带头2.3 循环或者非循环2.4 常用的链表 3. 单链表的实现3.1 单链表的打印3.2 单链表的头插3.3 单链表的尾插3.4 单链表的头删3.5 单链表的尾删3.6 单链表的查询3.7 在pos前插入数据3.8 在pos后插入数据3.9…

Linux——进程通信(一) 匿名管道

目录 前言 一、进程间通信 二、匿名管道的概念 三、匿名管道的代码实现 四、管道的四种情况 1.管道无数据&#xff0c;读端需等待 2.管道被写满&#xff0c;写端需等待 3.写端关闭&#xff0c;读端一直读取 4.读端关闭&#xff0c;写端一直写入 五、管道的特性 前言 …

不锈钢多功能电工剥线钳分线绕线剪线剥线钳剥线压线扒皮钳子

品牌&#xff1a;银隆 型号&#xff1a;089B绿色 材质&#xff1a;镍铬钢&#xff08;不锈钢&#xff09; 颜色分类&#xff1a;089B灰色,089B红色,089B绿色,089B黑色,089B橙色 功能齐集一身&#xff0c;一钳多用&#xff0c;多功能剥线钳。剥线&#xff0c;剪线&#xff…

Java-CAS 原理与 JUC 原子类

由于 JVM 的 synchronized 重量级锁涉及到操作系统&#xff08;如 Linux&#xff09; 内核态下的互斥锁&#xff08;Mutex&#xff09;的使用&#xff0c; 其线程阻塞和唤醒都涉及到进程在用户态和到内核态频繁切换&#xff0c; 导致重量级锁开销大、性能低。 而 JVM 的 synchr…

免费阅读篇 | 芒果YOLOv8改进114:上采样Dysample:顶会ICCV2023,轻量级图像增采样器,通过学习采样来学习上采样,计算资源需求小

&#x1f4a1;&#x1f680;&#x1f680;&#x1f680;本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 该专栏完整目录链接&#xff1a; 芒果YOLOv8深度改进教程 &#x1f680;&#x1f680;&#x1f680; DySample是一个超轻量级和有效的动态上采样器…

DDos攻击如何被高防服务器有效防范?

德迅云安全-领先云安全服务与解决方案提供商 什么是DDos攻击&#xff1f; DDos攻击是一种网络攻击手段&#xff0c;旨在通过使目标系统的服务不可用或中断&#xff0c;导致无法正常使用网络服务。DDos攻击可以采取多种方式实施&#xff0c;包括洪水攻击、压力测试、UDP Flood…

HTML静态网页成品作业(HTML+CSS)——游戏战地介绍设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

关于PXIE3U18槽背板原理拓扑关系

如今IT行业日新月异&#xff0c;飞速发展&#xff0c;随之带来的是数据吞吐量的急剧升高。大数据&#xff0c;大存储将成为未来数据通信的主流&#xff0c;建立快速、大容量的数据传输通道将成为电子系统的关键。随着集成技术和互连技术的发展&#xff0c;新的串口技术&#xf…

【QT+QGIS跨平台编译】之七十七:【QGIS_Gui跨平台编译】—【错误处理:字符串错误】

文章目录 一、字符串错误二、处理方法三、涉及到的文件一、字符串错误 常量中有换行符错误:(也有const char * 到 LPCWSTR 转换的错误) 二、处理方法 需要把对应的文档用记事本打开,另存为 “带有BOM的UTF-8” 三、涉及到的文件 src\gui\qgsadvanceddigitizingdockwidge…

ClickHouse中的设置的分类

ClickHouse中的各种设置 ClickHouse中的设置有几百个&#xff0c;下面对这些设置做了一个简单的分类。

【Godot 4.2】常见几何图形、网格、刻度线点求取函数及原理总结

概述 本篇为ShapePoints静态函数库的补充和辅助文档。ShapePoints函数库是一个用于生成常见几何图形顶点数据&#xff08;PackedVector2Array&#xff09;的静态函数库。生成的数据可用于_draw和Line2D、Polygon2D等进行绘制和显示。因为不断地持续扩展&#xff0c;ShapePoint…

Orbit 使用指南 03 | 与刚体交互 | Isaac Sim | Omniverse

如是我闻&#xff1a; “在之前的指南中&#xff0c;我们讨论了独立脚本&#xff08; standalone script&#xff09;的基本工作原理以及如何在模拟器中生成不同的对象&#xff08;prims&#xff09;。在指南03中&#xff0c;我们将展示如何创建并与刚体进行交互。为此&#xf…

机器学习周记(第三十周:文献阅读-SageFormer)2024.3.11~2024.3.17

目录 摘要 ABSTRACT 1 论文信息 1.1 论文标题 1.2 论文摘要 1.3 论文背景 2 论文模型 2.1 问题描述 2.2 模型信息 2.2.1 Series-aware Global Tokens&#xff08;序列感知全局标记&#xff09; 2.2.2 Graph Structure Learning&#xff08;图结构学习&#xff09; …