MySQL 索引的使用

本篇主要介绍MySQL中索引使用的相关内容。

目录

一、最左前缀法则

二、索引失效的场景

索引列运算

字符串无引号

模糊查询

or连接条件

数据分布


一、最左前缀法则

当我们在使用多个字段构成的索引时(联合索引),需要考虑最左前缀法则,最左前缀法则指的是,在使用联合索引来查询时,需要在查询条件里包含联合索引的所有字段,如果跳过了某个字段,那么该字段后面的其它字段(联合索引中的字段)的索引将全部失效。

例如,这里有一张表,表结构如下:

然后我们根据其中的sn,name,price三个字段建立联合索引 

此时,我们再通过explain来查看一下查询条件三个字段都包含的SQL语句的执行情况:

可以发现此时索引长度为1208.

接下来我们去掉最左边的sn字段

可以发现此时一个索引都不走了,因为最左前缀法则,使得sn以及后面的name,prcie字段的索引都失效了,从而整个联合索引都失效,致使该查询SQL不再走索引。我们再来跳过name字段看一下 可以发现索引长度只有402,那是因为跳过了name字段,使得name字段和price的索引都失效。

需要注意的是,如果我们其中一个字段,进行了范围查询,例如”<",也会导致该字段被跳过,此时我们需要使用 " <= "才不会使字段被跳过。因此,在使用联合索引时,如果要范围查询,尽量使用“<=" 或者 ">="。

综上所述,我们在使用联合索引时,应当遵从最左前缀法则,以免索引失效影响我们查询的性能。

二、索引失效的场景

在MySQL中,即使我们创建了索引,但在查询时不走索引,而是继续全表扫描,像这种情况,就称为索引失效,前面,联合索引跳过字段就是一种索引失效的场景。在MySQL中,很多场景下都有可能会出现索引失效的情况,下面我们来具体了解一下。

索引列运算

当我们在使用单列索引时(对一个字段创建的索引),如果我们对该列进行函数运,那么索引将会失效。例如,我们对weight字段创建一个单列索引:

如果我们对weight字段进行等值查询,通过explain可以发现成功走了索引 :

但如果我们在查询时使用了函数运算,通过explain可以发现并没有走索引,索引失效了。

字符串无引号

当我们在对一个字符串类型的字段通过索引进行查询时,如果字段的值未数值且没有加引号,索引将失效。

例如这里有一个字符串类型的字段name,给该字段添加索引。

 

然后我们通过索引来进行一下查询,查询时字段值加引号 可以发现此次查询走了索引。

我们再来看一下不加引号的情况(值为数值) 可以发现并未走索引,索引失效了 。

模糊查询

在对字符串类型的字段通过索引来查询时,如果使用了模糊匹配,且在模糊匹配的字符串前加了‘ % ’号则索引失效。例如我们还是使用前面的name字段,然后使用模糊匹配进行查询,分别在中间和末尾加上”%"号

可以发现这两次都走了索引。接下来我们再来看一下"%"号在前面的情况:

 结果可以发现索引失效了,但通常情况下,我们需要在最前面加"%"号,但我们又想走索引,那怎么办呢?我们可以使用覆盖索引来解决,使用覆盖索引在前面加 ” %"号索引就不会失效了。(覆盖索引在后面会详细介绍)。

or连接条件

在查询中使用了or关键字时,如果or前面的字段有索引,而or后面的字段没有使用索引,那么or前面的和or后面的字段的索引将全部失效。

例如,我们通过explain来查看一下下面这条SQL, 可以发现由于or后面的age字段没有添加索引,导致前面的name字段的索引失效了,接下来,我们给age加上索引

可以发现此时索引生效了,因此可以得出结论只有or前面的字段和后面的字段都有索引时,索引才会生效。

数据分布

在查询过程中,如果查询的结果的行数和整张表的行数接近,那么MySQL就会认为走索引不如全表扫描效率高(因为此时索引查的次数和全表查询接近了,且索引还需要进行回表等操作,因此此时索引的效率就不如全表扫描了),因此就不走索引,而是进行全部扫描,从而导致索引失效。

例如我们来用explian看一下下面这条SQL 

可以发现并没有走索引,这是因为表中大部分记录的name字段都不为空,系统认为全表扫描可能效率更高,从而使索引失效了。

然后我们再来看一下下面这条SQL:

可以发现这次走了索引,这是因为表中的记录基本都不为空,因此索引只需要查几次就能完成查询而全表扫描需要遍历整张表,因此系统选择了更快的走索引的方式。 

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

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

相关文章

【VTKExamples::Utilities】第十七期 ZBuffer

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ZBuffer,并解析接口vtkWindowToImageFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ…

【面试八股总结】MySQL事务:事务特性、事务并行、事务的隔离级别

参考资料&#xff1a;小林coding 一、事务的特性ACID 原子性&#xff08;Atomicity&#xff09; 一个事务是一个不可分割的工作单位&#xff0c;事务中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部不完成&#xff0c;不会结束在中间某个环节。原子性是通过 undo …

Arm发布Cortex X925、A725、A520,Armv9.2架构

随着半导体行业的不断发展&#xff0c;Arm 通过突破技术界限&#xff0c;为终端用户提供尖端解决方案&#xff0c;在核心和 IP 架构创新方面处于领先地位&#xff0c;尤其是在移动领域。2024 年&#xff0c;Arm 的年度战略进步重点是增强去年的 Armv9.2 架构&#xff0c;并带来…

Windows系统安装openvino(2024.1.0)

一、openvino下载&#xff1a; 下载地址&#xff1a;下载英特尔发行版 OpenVINO 工具套件 (intel.cn) 下载完之后将压缩包解压&#xff0c;然后重命名文件夹为openvino_2024.1.0。 二、环境配置 以python环境为例&#xff1a;&#xff08;建议使用moniconda虚拟环境来安装&am…

鸿蒙ArkTS声明式开发:跨平台支持列表【背景设置】 通用属性

背景设置 设置组件的背景样式。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版…

【免费Web系列】JavaWeb实战项目案例五

这是Web第一天的课程大家可以传送过去学习 http://t.csdnimg.cn/K547r 新增员工 前面我们已经实现了员工信息的条件分页查询。 那今天我们要实现的是新增员工的功能实现&#xff0c;页面原型如下&#xff1a; ​ 首先我们先完成"新增员工"的功能开发&#xff0…

ODBC访问达梦数据库Ubuntu18.04 x86-x64(亲测有效)

ODBC访问达梦数据库Ubuntu18.04 x86-x64 第1步&#xff1a;安装unixodbc驱动,使用下面命令。第2步&#xff1a;拷贝已经安装好的达梦数据库驱动程序第3步&#xff1a;配置ODBC必要的参数文件&#xff0c;如下图第4步&#xff1a;设置环境变量第5步&#xff1a;连接测试 说明&am…

Github单个文件或者单个文件夹下载插件

有时候我们在github上备份了一些资料&#xff0c;比如pdf,ppt&#xff0c;md之类的,需要用到的时候只要某个文件即可&#xff0c;又不要把整个仓库的zip包下载下来&#xff0c;毕竟有时文件太多&#xff0c;下载慢&#xff0c;我们也不需要所有资料&#xff0c;那么就可以使用到…

docker安装Mysql5.7版本

首先Linux系统已经安装好了docker应用。 1.搜索镜像 docker search mysql 2.拉取5.7的镜像 总之,选starts最多的那个就对了。 docker pull mysql:5.7 ~ docker pull mysql:5.7 5.7: Pulling from library/mysql fc7181108d40: Downloading [============> …

C语言数据结构(超详细讲解)| 二叉树的实现

二叉树 引言 在计算机科学中&#xff0c;数据结构是算法设计的基石&#xff0c;而二叉树&#xff08;Binary Tree&#xff09;作为一种基础且广泛应用的数据结构&#xff0c;具有重要的地位。无论是在数据库索引、内存管理&#xff0c;还是在编译器实现中&#xff0c;二叉树都…

Github 如何配置 PNPM 的 CI 环境

最近出于兴趣在写一个前端框架 echox&#xff0c;然后在 Github 上给它配置了最简单的 CI 环境&#xff0c;这里简单记录一下。 特殊目录 首先需要在项目根目录里面创建 Github 仓库中的一个特殊目录&#xff1a;.github/workflows&#xff0c;用于存放 Github Actions 的工作…

MyBatis基础理解教程,详细分步基础查询表数据练习(通俗易懂、实时更新)

一、MyBatis是什么 MyBatis 是一个持久层框架&#xff0c;简化JDBC开发&#xff0c;它提供了一个从 Java 应用程序到 SQL 数据库的桥梁&#xff0c;用于数据的存储、检索和映射。MyBatis 支持基本的 SQL 操作、高级映射特性以及与 Maven 等构建工具的集成。 二、持久层是什么…

matlab GUI界面设计

【实验内容】 用MATLAB的GUI程序设计一个具备图像边缘检测功能的用户界面&#xff0c;该设计程序有以下基本功能&#xff1a; &#xff08;1&#xff09;图像的读取和保存。 &#xff08;2&#xff09;设计图形用户界面&#xff0c;让用户对图像进行彩色图像到灰度图像的转换…

力扣2965. 找出缺失和重复的数字

题目&#xff1a; 给你一个下标从 0 开始的二维整数矩阵 grid&#xff0c;大小为 n * n &#xff0c;其中的值在 [1, n] 范围内。除了 a 出现两次&#xff0c;b 缺失 之外&#xff0c;每个整数都恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个下标从 0 开始…

【面结构光三维重建】0.基于openCV实现相机的标定

1.标定结果 2.相机标定原理 相机标定是计算机视觉和机器视觉领域中的重要技术,用于确定相机成像的几何关系和畸变特性,以提高成像的精度和稳定性。该技术广泛应用于三维重建、机器人视觉、自动驾驶等领域。 世界坐标系:由用户定义的三维世界坐标系,描述物体和相机在真实世…

C++的第一道门坎:类与对象(三)

目录 一.再谈构造函数 1.1构造函数体赋值 1.2初始化列表 1.3explicit关键字 二.static成员 2.1概念 ​编辑 2.2特性 三.友元 3.1友元函数 3.2友元类 4.内部类 一.再谈构造函数 1.1构造函数体赋值 class Date { public:Date(int year,int month,int day){_year ye…

32. 【Java教程】集合

在前面的小节中&#xff0c;我们学习了数组&#xff0c;本小节学习的集合同样用于存放一组数据&#xff0c;我们将学习什么是集合、集合的应用场景 &#xff0c;在应用场景部分我们将对比 Java 数组与集合的区别&#xff0c;还将系统介绍 Java 集合的架构&#xff0c;也将结合实…

千里之堤,溃于蚁穴

今天写代码的时候找错误找得好辛苦&#xff0c;我发现看似两段相同的代码却有不同的运行效果&#xff0c;真是感慨啊&#xff0c;千里之堤&#xff0c;溃于蚁穴。我比对好几遍这两段代码&#xff0c;找了半天并没有发现有什么不同之处。 最后去网上搜索工具&#xff0c;最后找到…

echart扩展插件词云echarts-wordcloud

echart扩展插件词云echarts-wordcloud 一、效果图二、主要代码 一、效果图 二、主要代码 // 安装插件 npm i echarts-wordcloud -Simport * as echarts from echarts; import echarts-wordcloud; //下载插件echarts-wordcloud import wordcloudBg from /components/wordcloudB…

Qt图像处理技术十:得到QImage图像的高斯模糊

效果图 参数为5 参数为20 原理 高斯模糊使用正态分布来分配周围像素的权重。具体来说&#xff0c;距离中心点越近的像素对最终结果的影响越大&#xff0c;权重也越高&#xff1b;随着距离的增加&#xff0c;权重逐渐减小。 这种权重分配方式确保了图像在模糊处理时&#xff0…