Mysql索引失效的原因有哪些?

📚 避免索引失效是一种常见的SQL优化

MySQL是一种关系型数据库,它可以通过建立索引来提高查询效率。索引是一种数据结构,它可以让数据库快速地找到满足条件的记录,而不需要扫描整张表。但是,并不是所有的查询都能利用索引,有时候索引会失效,导致查询性能下降。那么,MySQL索引失效的原因有哪些呢?如何避免或解决索引失效的问题呢?本文将从以下七个方面来介绍:

  1. 数据类型不匹配。

如果查询条件中的数据类型和索引列的数据类型不一致,MySQL会进行隐式类型转换,这会导致索引失效。例如,如果索引列是varchar类型,而查询条件是数字类型,MySQL会将索引列转换为数字类型进行比较,这样就无法使用索引了。解决方法是保持数据类型的一致性,或者在查询条件中使用显式类型转换。

  1. 模糊查询以%开头。

如果查询条件中使用了like关键字,并且模糊匹配的字符串以%开头,那么也会导致索引失效。这是因为以%开头的模糊匹配无法确定索引列的起始位置,所以无法利用索引进行快速查找。解决方法是尽量避免使用以%开头的模糊匹配,或者使用覆盖索引(只包含索引列的查询)。

  1. 索引列使用了函数或运算。

如果查询条件中对索引列进行了函数调用或运算,那么也会导致索引失效。这是因为函数或运算会改变索引列的值,使得原来的索引无法使用。解决方法是尽量避免对索引列使用函数或运算,或者建立基于函数或运算的索引(MySQL 5.7及以上版本支持)。

  1. 索引列包含空值。

如果索引列中包含空值(NULL),那么在查询条件中使用IS NULL或IS NOT NULL也会导致索引失效。这是因为MySQL在建立索引时不会存储空值,所以无法通过索引来判断是否为空。解决方法是尽量避免让索引列包含空值,或者在建立索引时指定NOT NULL约束。

  1. 查询条件中使用了OR关键字。

如果查询条件中使用了OR关键字,并且OR两边的条件涉及到不同的索引列,那么也会导致索引失效。这是因为MySQL无法同时使用多个索引来进行查询优化,所以只能选择全表扫描。解决方法是尽量避免使用OR关键字,或者将OR两边的条件分别用括号括起来,并且在括号内部使用相同的索引列。

  1. 联合索引违反了最左前缀原则。

如果建立了联合索引(多个列组成的索引),那么在查询条件中必须遵循最左前缀原则,即从左到右依次使用联合索引中的列,不能跳过任何一列。否则,也会导致索引失效。例如,如果建立了(name, age, gender)的联合索引,那么在查询条件中可以使用name,或者name和age,或者name,age和gender,但是不能只使用age或gender,也不能只使用age和gender。解决方法是尽量按照最左前缀原则来使用联合索引,并且将区分度高的列放在前面。

  1. 全表扫描比使用索引更快。

有时候,即使查询条件中完全符合索引的使用条件,MySQL也可能不会使用索引,而是选择全表扫描。这是因为MySQL有一个优化器,它会根据表中的数据量和分布情况,预估使用索引和全表扫描的代价,选择一个更快的方案。例如,如果表中的数据量很小,或者查询条件中的过滤条件很宽松,导致命中的记录很多,那么全表扫描可能比使用索引更快。解决方法是根据实际情况调整查询条件或索引设计,或者强制使用索引(使用FORCE INDEX或USE INDEX提示)。

总结

MySQL索引失效是一个常见的性能问题,它会导致查询效率下降,甚至影响整个系统的稳定性。因此,我们需要了解索引失效的原因和解决方法,避免在编写SQL语句时犯一些低级错误。同时,我们也需要定期检查和优化索引的设计和使用情况,确保索引能够发挥最大的作用。

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

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

相关文章

1.centos 镜像

centos 它有官网的下载地址:https://vault.centos.org/ 选择想要的版本,我选择 centos7.8 进入到镜像目录 isos 选择 x86_64 选择想要的版本,我选择 CentOS-7-x86_64-DVD-2003.iso 安装就正常安装就行。我选择虚拟机安装。这个参考&…

git的安装以及入门使用

文章目录 git的安装以及入门使用什么是git?git安装git官网 git初始化配置使用方式初始化配置: git的安装以及入门使用 什么是git? Git 是一个免费开源的分布式版本控制系统,使用特殊的仓库数据库记录文件变化。它记录每个文件的…

⭐ Unity Pico PXR_SDK转场淡入淡出

PXR_ScreenFade 脚本:官方SDK 脚本实现了屏幕的淡入淡出功能,封装了 CloseEyes 和 OpenEyes 方法,可以通过传入 Action 执行淡入淡出完成后的逻辑。 FadeController 脚本: 通过 GetComponent 获取 PXR_ScreenFade 组件&#xff0…

前端开发设计模式——状态模式

目录 一、状态模式的定义和特点 二、状态模式的结构与原理 1.结构: 2.原理: 三、状态模式的实现方式 四、状态模式的使用场景 1.按钮的不同状态: 2.页面加载状态: 3.用户登录状态: 五、状态模式的优点 1.提…

Matplotlib和Seaborn数据可视化

目录 Matplotlib图表绘制 准备工作 折线图line 柱状图bar 水平条形图barh 饼图pie 散点图scatter 气泡图csatter 箱线图boxplot 直方图hist 蜂巢图hexbin Seaborn图表绘制 准备数据 关系散点图scatterplot 关系散点线形图replot 分类散点图stripplot 分类小提…

代码随想录算法训练营第五天| 哈希表理论基础 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

哈希表基础课程笔记 1. 什么是哈希表 哈希表(Hash Table)又称为散列表,是一种基于关键码(Key)直接进行访问的数据结构。简单理解,数组其实也是一种哈希表。哈希表通过关键码映射到数组的索引,…

Flink窗口分配器WindowAssigner

前言 Flink 数据流经过 keyBy 分组后,下一步就是 WindowAssigner。 WindowAssigner 定义了 stream 中的元素如何被分发到各个窗口,元素可以被分发到一个或多个窗口中,Flink 内置了常用的窗口分配器,包括:tumbling wi…

前缀和和差分算法

文章目录 一维前缀和一维前缀和概念一维前缀和数组的构建 二维前缀和二维前缀和概念二维前缀和数组的构建 一维差分一维差分概念一维差分数组的构建 二维差分二维差分概念二维差分数组的构建 一维前缀和 一维前缀和概念 一维前缀和是一种常用的数据预处理方法,它能…

JS事件和DOM

1. DOM 1.1 基本概念 DOM,全称 Document Object Model,即文档对象模型。它是 Web 上最常用的 API 之一,是加载在浏览器中的文档模型,可以将文档表示为节点树(或称 DOM 树),其中每个节点代表文…

Docker system

docker system --help siqialiyun-sh-001:~/images$ sudo docker system --helpUsage: docker system COMMANDManage DockerCommands:df Show docker disk usage(显示docker磁盘使用情况)events Get real time events from the server(从服务器获取实时事件)in…

MySQL新手向:对比常用存储引擎

前言 为什么MySQL拥有的存储引擎有那么多,偏偏最常用的是InnoDB呢?带着这个问题,让我们对比几种常用的存储引擎,理解InnoDB的优势吧。 一、MyISAM存储引擎 1.1、MyISAM介绍 先说说MyISAM存储引擎的特点: 不支持事…

【协议】IIC总线协议学习

一、IIC基本介绍 设计I2C的初衷是减少电视机等复杂电子系统内部的布线数量,同时也降低制造成本。通过使用只有两根线的通信总线,它有效地减少了器件间连接的复杂性。 IIC总线是两线制总线,仅有串行数据线SDA和串行时钟线SCL进行通信。减少…

代码笔记:Linux系统上解压文件

zip unzip filename.zip -d /path/to/directorytar.gz tar -xzvf file.tar.gz -x: 表示提取(extract)文件,从压缩包中解压内容。-z: 表示使用 gzip 压缩,.tar.gz 文件是经过 gzip 压缩的 tar 包,因此需要这个选项来处…

存储设备专栏 2.5 -- linux 下块设备信息查看命令 lsblk 详细介绍】

> 请阅读【嵌入式及芯片开发学必备专栏】< 文章目录 lsblk 命令命令结构常用参数示例示例 1&#xff1a;基本用法示例 2&#xff1a;显示文件系统信息示例 3&#xff1a;仅列出磁盘示例 4&#xff1a;指定输出格式示例 5&#xff1a;以 JSON 格式输出 Summary lsblk 命令…

算法之二分查找

概述 二分查找算法的应用&#xff0c;包括有序和无序数据&#xff0c;有序数组默认按从小到大排序 在有序数组中找到num /*** 4 二分查找 在有序数组中找到num* 思路&#xff1a;找中值&#xff0c;然后中值元素和目标值比较。如果中值元素比目标值大&#xff0c;则继续在左…

React开发一个WebSocket

export default class SocketService {static instance null;static get Instance() {if (!this.instance) {this.instance new SocketService();}return this.instance;}// 和服务端连接的socket对象ws null;// 存储回调函数callBackMapping {};// 标识是否连接成功connec…

【Python实例】Python读取并绘制tif数据

【Python实例】Python读取并绘制tiff数据 Python实例-以全球不透水面积数据为例数据准备&#xff1a;全球不透水面积数据基于gdal库绘制tif图基于Rasterio库绘制tif图 参考 GeoTIff 是一个标准的.tif 文件或是一个图像文件格式&#xff0c;它包含了一些额外的空间信息&#xff…

Prometheus 抓取 nginx 访问日志的指标

要通过 Prometheus 的 NGINX Exporter 来抓取 NGINX 中的日志信息&#xff0c;例如状态码为 4xx 或 5xx 的日志&#xff0c;需要结合以下几种工具和方法&#xff1a; 1. NGINX Exporter 基础功能 NGINX Exporter 是一个 Prometheus Exporter&#xff0c;用于从 NGINX 的 /sta…

.mkp勒索病毒攻击全攻略:防护、数据恢复与安全建议

导言 随着互联网的发展&#xff0c;勒索病毒的威胁也在不断升级&#xff0c;给个人和企业的数据安全带来了巨大的挑战。其中&#xff0c;[datastorecyberfear.com].mkp、 [tsai.shenmailfence.com].mkp、 [sspdlk00036cock.li].mkp勒索病毒作为一种新型的加密型恶意病毒&#…

Chromium 中HTML5 WebSocket实现分析c++(一)

一、WebSocket前端接口定义&#xff1a; WebSocket 对象提供了用于创建和管理 WebSocket 连接&#xff0c;以及可以通过该连接发送和接收数据的 API。 使用 WebSocket() 构造函数来构造一个 WebSocket。 构造函数 WebSocket(url[, protocols]) 返回一个 WebSocket 对象。 …