MySQL什么情况下会导致索引失效

ops/2024/12/26 0:17:46/

MySQL什么情况下会导致索引失效


索引(Index)是数据库中一种用于快速查找和访问表中数据的结构,它类似于书的目录,通过索引可以快速定位到目标数据,而无需遍历整个表,索引的存在可以显著提高查询速度,尤其是在处理大量数据时

有时我们为了避免出现回表查询,我们就会以多个字段来创建索引,即覆盖索引,具体可看:聚簇索引、非聚簇索引、覆盖索引-CSDN博客

使用覆盖索引最容易遇到的问题就是索引失效问题,那么哪些情况下会出现索引失效,又该如何避免索引失效呢?

索引命中

以一个tb_users表为例子:

在这里插入图片描述

我们以其中三个字段建立索引:

CREATE INDEX tb_user_index ON tb_users(name, status,username)

可以利用show语句可以查看我们刚刚为tb_users建立的索引:

SHOW INDEX FROM tb_users

在这里插入图片描述

索引字段也是有顺序的,顺序就是我们创建索引时的顺序,使用explain可以查看SQL语句的执行计划:

1.单个条件

EXPLAIN SELECT * FROM tb_users WHERE name = '崔秀英'

在这里插入图片描述

命中索引的长度是43,此时我们的查询条件只有name,因此命中的索引也只有name

此时查询条件中添加一个status字段:

2.两个字段

EXPLAIN SELECT * FROM tb_users WHERE name = '崔秀英' AND status = 1

在这里插入图片描述

此时命中索引的长度为48,表示命中了name和status

再次添加一个字段:

3.三个字段条件

EXPLAIN SELECT * FROM tb_users WHERE name = '崔秀英' AND status = 1 AND username = 'Joe Edwards'

在这里插入图片描述

此时三个索引字段全部命中,索引长度为131

因此命中索引的数量不一样,key_len也不一样,可以利用它来判断索引是否失效


索引失效

1.违反最左前缀法则会导致索引失效

指的是查询从索引的最左前列开始,中间不跳过索引中的列,比如:

EXPLAIN SELECT * FROM tb_users WHERE name = '崔秀英' AND username = 'Joe Edwards'

这条查询语句中,我们用两个索引字段作为了查询条件,那么理论上应该命中两个索引

在这里插入图片描述

但是key_len的值为43,只命中了name字段,username字段索引失效了,因为中间跳过了索引中的一列status

2.范围查询某个索引,其右边索引失效

当where条件中用索引范围查询,这个索引右边的字段会失效

EXPLAIN SELECT * FROM tb_users WHERE name = '崔秀英' AND status > 1 AND username = 'Joe Edwards'

这条查询语句使用了三个索引条件,理论上key_len为131

在这里插入图片描述

但是实际上命中索引长度为48,username字段未命中,原因是status使用了范围查询,因此他右边的username失效了

3.在索引列上进行运算操作,会导致索引失效

EXPLAIN SELECT * FROM tb_users WHERE SUBSTRING(0,1,name) = '崔秀英'

这里对name字段进行了截取运算操作

在这里插入图片描述

因此name字段并未命中,导致索引失效

4.字符串不加单引号,导致索引失效

比如说status字段,上表中我们使用的是int类型,假如我们使用了varchar类型,在查询的时候就要加单引号,如:

EXPLAIN SELECT * FROM tb_users WHERE name = '崔秀英' AND status = '1'

如果没有加单引号,MySQL就会进行多余的类型转换步骤,该步骤会导致索引失效

5.以%开头的like模糊查询,会导致索引失效

如果仅仅是尾部模糊匹配,索引不会失效,如果是头部模糊匹配,索引会失效

EXPLAIN SELECT * FROM tb_users WHERE name LIKE '%秀英'

在这里插入图片描述

可以看到索引命中长度为null,索引失效了


http://www.ppmy.cn/ops/144971.html

相关文章

[工具]GitHub Copilot 直接提供免费额度了

有福了! GitHub Copilot 直接提供免费额度——每个月享 2000个代码提示完成额度(每个工作日大约80个),以及 50个聊天请求。后台是访问 GPT-4o 和 Claude 3.5 Sonnet 模型。 插件支持VS Code、VS 2022、JetBrains、... 这下 Curs…

Java 重写(Override)与重载(Overload)

重写 (Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变。即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。…

【漏洞复现】CVE-2021-45788 SQL Injection

漏洞信息 NVD - cve-2021-45788 Time-based SQL Injection vulnerabilities were found in Metersphere v1.15.4 via the “orders” parameter. Authenticated users can control the parameters in the “order by” statement, which causing SQL injection. API: /test…

前端对页面数据进行缓存

页面录入信息,退出且未提交状态下,前端对页面数据进行存储 前端做缓存,一般放在local、session和cookies里面,但是都有大小限制,如果页面东西多,比如有上传的图片、视频,浏览器会抛出一个Quota…

【AIStarter:项目管理平台】Krita 5.2.6 + AI 1.29 + ComfyUI 插件:创作与效率的完美结合

引言 在数字艺术创作的世界里,工具的选择往往决定了作品的质量和创作的效率。对于追求高效与便捷的艺术家们来说,Krita 5.2.6、AI 1.29 和 ComfyUI 插件的组合无疑是一套理想的解决方案。这套集成了最新技术的软件套装,不仅提供了强大的绘图…

用友-友数聚科技CPAS审计管理系统V4 downPlugs存在任意文件下载漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…

Odoo 免费开源 ERP:通过 JavaScript 创建对话框窗口的技术实践分享

作者 | 老杨 出品 | 上海开源智造软件有限公司(OSCG) 概述 在本文中,我们将深入研讨如何于 Odoo 18 中构建 JavaScript(JS)对话框或弹出窗口。对话框乃是展现重要讯息、确认用户操作以及警示用户留意警告或错误的行…

K8s - openeuler2203SP1安装 K8s + flannel

环境说明 [rootmaster-1 ~]# uname -a Linux master-1 5.10.0-136.12.0.86.oe2203sp1.x86_64 #1 SMP Tue Dec 27 17:50:15 CST 2022 x86_64 x86_64 x86_64 GNU/Linux安装过程 1、安装 containerd 下载 tar 包 # 确保没有使用官方仓库的containerd [rootlocalhost ~]# yum rem…