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:

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

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

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

相关文章

COMSOL中液晶材料光学特性模拟

前面我们根据FDTD官方文档设置了液晶指向的模型。COMSOL也可以根据相似的方法设置各项异性的周期性变化的材料。 该方法参考了luneburg_lens的COMSOL文档 在给出的文件中&#xff0c;可以发现定义-变量中可以使用默认坐标作为变量&#xff0c;即xyz。因此&#xff0c;折射率也可…

德人合科技——天锐绿盾内网安全管理软件 | -文档透明加密模块

天锐绿盾文档加密功能能够为各种模式的电子文档提供高强度加密保护&#xff0c;丰富的权限控制以及灵活的应用管理&#xff0c;帮助企业构建更严密的立体保密体系。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee ————…

【算法】MT2 棋子翻转

✨题目链接&#xff1a; MT2 棋子翻转 ✨题目描述 在 4x4 的棋盘上摆满了黑白棋子&#xff0c;黑白两色棋子的位置和数目随机&#xff0c;其中0代表白色&#xff0c;1代表黑色&#xff1b;左上角坐标为 (1,1) &#xff0c;右下角坐标为 (4,4) 。 现在依次有一些翻转操作&#…

【并发程序设计】12.内存映射

12.内存映射 使一个磁盘文件与内存中的一个缓冲区相映射&#xff0c;进程可以像访问普通内存一样对文件进行访问&#xff0c;不必再调用read,write&#xff0c;更加高效。 用到的函数 mmap函数 原型&#xff1a; #include <sys/mman.h> void* mmap(void* start, size_…

py黑帽子学习笔记_web攻击

python网络库 py2的urllib2 py3好像把urllib2继承到了标准库urllib&#xff0c;直接用urllib就行&#xff0c;urllib2在urllib里都有对应的接口 py3的urllib get请求 post请求&#xff0c;和get不同的是&#xff0c;先把post请求数据和请求封装到request对象&#xff0c;再…

亚马逊云科技专家分享 | OPENAIGC开发者大赛能量加油站6月5日场预约开启~

由联想拯救者、AIGC开放社区、英特尔联合主办的“AI生成未来第二届拯救者杯OPENAIGC开发者大赛”自上线以来&#xff0c;吸引了广大开发者的热情参与。 为了向技术开发者、业务人员、高校学生、以及个体创业人员等参赛者们提供更充分的帮助与支持&#xff0c;AIGC开放社区特别…

lua 计算第几周

需求 计算当前赛季的开始和结束日期&#xff0c;2024年1月1日周一是第1周的开始&#xff0c;每两周是一个赛季。 lua代码 没有处理时区问题 local const 24 * 60 * 60 --一整天的时间戳 local server_time 1716595200--todo:修改服务器时间 local date os.date("*t…

解析前端开发中同源策略与配置代理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 在前端开发中&#xff0c;跨域请求是一个常见的问题。同源策略限制了浏览器中一个页面…

2024中青杯数学建模竞赛A题人工智能视域下养老辅助系统的构建思路代码论文分析

2024中青杯数学建模A题论文和代码已完成&#xff0c;代码为A题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型的评价…

使用 Django Model 构建强大的数据库模型

文章目录 创建一个简单的 Django Model迁移数据库使用 Django Shell 操作模型Django Admin结论 在 Django 中&#xff0c;Model 是构建数据库模型的基础。它允许开发人员定义数据的结构&#xff0c;并提供了方便的方式来与数据库进行交互。本文将介绍如何使用 Django Model 来创…

光环云携手火山引擎共推全栈AI服务,赋能千行百业智能化转型,助力新质生产力发展

5月15日&#xff0c;2024春季火山引擎FORCE原动力大会在北京举办。作为智算云网综合服务提供商&#xff0c;光环云受邀出席大会&#xff0c;与火山引擎共同探索大模型时代下行业发展的新趋势。 会上&#xff0c;光环云数据有限公司正式与火山引擎签署生态伙伴合作协议&#xf…

Goby 漏洞发布|万户ezEIP企业管理系统 /member/success.aspx 命令执行漏洞

漏洞名称&#xff1a;万户ezEIP企业管理系统 /member/success.aspx 命令执行漏洞 English Name&#xff1a;Wanhu-ez-EIP /member/success.aspx Command Execution Vulnerability CVSS core: 9.0 影响资产数&#xff1a;6175 漏洞描述&#xff1a; 万户ezEIP是一种企业资源…

服务器内存与CPU要占用多少才合理?

一 通常服务器内存占用多少合理&#xff1f;cpu占用多少才合理&#xff1f; 1 通常配置范围建议&#xff1a; 建议CPU使用率不高于80%&#xff1b;内存使用率不高于80%&#xff1b; 注意&#xff1a;具体情况还需要根据服务器的实际负载和应用场景来判断。 2 内存使用率&…

【Linux系列】深入解析 `kill` 命令:Linux 下的进程管理利器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Java的JDBC编程

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 关注博主带你了解更多数据结构知识 1. Java的数据库编程&#xff1a;JDBC 数据库驱动包&#xff1a;不同的数据库&#xff0c;对应不同的编程语言提供了不同的数据库驱动包&#xff0c;如&#xff1…

JDK JRE JVM 三者的关系

总结&#xff1a; 1. jdk 中 的 javac 编译器将 .java 文件编译为 .class 字节码文件 &#xff08;编译&#xff09; 2. jre 执行 .class 字节码文件 &#xff08;运行&#xff09; 3. jre 通过 jvm 运行程序&#xff0c;确保程序能够在不同平台上正确执行&#xff08;实现跨平…

UE5 双手握剑的实现(逆向运动学IK)

UE5 双手握剑的实现 IK 前言 什么是IK&#xff1f; UE官方给我们提供了很多对于IK处理的节点&#xff0c;比如ABRIK、Two Bone IK、Full Body IK 、CCD IK等&#xff0c;但是看到这&#xff0c;很多人就好奇了&#xff0c;什么是IK&#xff1f; 首先我们来看看虚幻小白人的骨…

使用KEPServer连接欧姆龙PLC获取对应标签数据(标签值类型改为字符串型)

1.创建通道&#xff08;通道&#xff09;&#xff0c;&#xff08;选择对应的驱动&#xff0c;跟当前型号PLC型号对应&#xff09;。 2.创建设备&#xff0c;&#xff08;填入IP地址以及欧姆龙的默认端口号&#xff1a;44818&#xff09; 3.创建对应的标签。这里关键讲诉下字…

[Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解

目录 0.子序列 vs 子数组1.最长递增子序列1.题目链接2.算法原理详解3.代码实现 2.摆动序列1.题目链接2.题目链接3.代码实现 0.子序列 vs 子数组 子序列&#xff1a; 相对顺序是跟源字符串/数组是一致的但是元素和元素之间&#xff0c;在源字符串/数组中可以是不连续的一般时间…

14-alert\confirm\prompt\自定义弹窗

一、认识alert\confirm\prompt 下图依次是alert、confirm、prompt&#xff0c;先认清楚长什么样子&#xff0c;以后遇到了就知道如何操作了。 二、alert操作 先用driver.switch_to.alert方法切换到alert弹出框上&#xff1b;可以用text方法获取弹出的文本信息&#xff1b;acce…