导致MySQL索引失效的原因有哪些?

文章精选推荐

1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,自动生成时序图
4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的使用与功能特点
6 Ai assistant ,又是一个写代码神器

文章正文

在 MySQL 中,索引失效是指数据库查询在本应使用索引的情况下,未能使用索引,导致查询性能下降。常见的原因包括查询写法问题、数据类型不匹配、函数运算等。了解这些原因和解决方案可以帮助优化数据库查询性能。

1. 使用了不等于(!=<>)操作符

问题

  • MySQL 索引对于 =IN 操作符非常高效,但对 !=<> 操作符的支持较差,因为无法直接利用索引优化查询。对于 !=<> 查询,MySQL 会进行全表扫描,从而导致索引失效。

示例

SELECT * FROM products WHERE price != 100;

解决方案

  • 尽量避免使用 !=<> 操作符,如果有业务需求,考虑使用 NOT IN 或其他方式来代替,或尽量调整查询设计。
-- 避免使用 !=
SELECT * FROM products WHERE price < 100 OR price > 100;

2. 使用了 OR 连接多个条件

问题

  • 当查询中使用 OR 连接多个条件时,MySQL 可能无法使用索引,特别是当 OR 两边的条件字段使用了不同的索引时,MySQL 会选择不使用索引进行全表扫描。

示例

SELECT * FROM products WHERE price = 100 OR stock > 50;

解决方案

  • 尽量避免在同一查询中使用多个 OR 条件,特别是涉及不同字段时。可以通过拆分成多个查询来优化。
-- 使用 UNION 查询替代 OR
SELECT * FROM products WHERE price = 100
UNION ALL
SELECT * FROM products WHERE stock > 50;

3. 对索引列进行了函数操作

问题

  • 如果对索引列使用了函数(如 LOWER(), UPPER(), DATE() 等),则索引将失效,因为函数会使得查询变得不可预见,从而导致 MySQL 不能利用索引。

示例

SELECT * FROM products WHERE LOWER(name) = 'iphone';

解决方案

  • 尽量避免对索引列使用函数操作。如果确实需要进行此类操作,可以考虑使用 生成列计算列 来存储处理后的值。
-- 使用计算列存储预处理结果
ALTER TABLE products ADD COLUMN lower_name VARCHAR(255) GENERATED ALWAYS AS (LOWER(name)) STORED;
-- 然后对该列进行索引
CREATE INDEX idx_lower_name ON products(lower_name);

4. 使用了 LIKE 操作符并且前面有通配符

问题

  • 如果 LIKE 查询条件以 % 开头,MySQL 不能使用索引,因为它必须扫描整个表来查找匹配的字符串。

示例

SELECT * FROM products WHERE name LIKE '%phone';

解决方案

  • 避免使用以 % 开头的 LIKE 查询。如果业务需求不可避免,考虑使用全文索引(FULLTEXT)或其他搜索引擎(如 Elasticsearch)来代替。
-- 使用全文索引
ALTER TABLE products ADD FULLTEXT(name);
SELECT * FROM products WHERE MATCH(name) AGAINST ('phone');

5. 数据类型不匹配

问题

  • 如果查询条件中的字段与索引字段的数据类型不匹配,MySQL 可能无法使用索引。例如,查询条件是字符串类型,而索引列是数字类型。

示例

SELECT * FROM products WHERE price = '100';

解决方案

  • 确保查询时条件的数据类型与表中字段的数据类型一致。可以通过强制转换数据类型或调整查询来确保匹配。
-- 强制转换数据类型
SELECT * FROM products WHERE price = CAST('100' AS DECIMAL(10, 2));

6. 使用了 IS NULLIS NOT NULL 条件

问题

  • 虽然 IS NULLIS NOT NULL 条件可以使用索引,但如果索引列中的数据分布不均匀,查询可能仍然会导致索引失效,特别是在大数据量的情况下。

示例

SELECT * FROM products WHERE price IS NULL;

解决方案

  • 如果某个列中有大量的 NULL 值,使用 IS NULL 查询时可能会导致性能问题。可以考虑对数据进行预处理,避免 NULL 值的使用,或者将 NULL 值替换为一个默认值。

7. 索引选择性差

问题

  • 当索引列的数据分布不均匀时,索引的选择性较差,MySQL 可能会放弃使用索引,转而进行全表扫描。例如,索引列的值过于重复。

示例

-- 如果 gender 列的值只有 "male" 和 "female",那么查询会导致索引失效
SELECT * FROM users WHERE gender = 'male';

解决方案

  • 使用具有更高选择性的列来创建索引,或者通过复合索引来提高索引的选择性。
-- 创建复合索引
CREATE INDEX idx_gender_name ON users(gender, name);

8. 没有合适的索引

问题

  • 如果查询的字段没有合适的索引,MySQL 会选择全表扫描。没有合适的索引,查询性能会显著下降。

示例

SELECT * FROM products WHERE name = 'iPhone' AND price = 999;

解决方案

  • 为查询条件字段创建合适的索引,特别是那些在 WHERE 子句、JOINORDER BY 等操作中频繁使用的字段。
-- 创建复合索引
CREATE INDEX idx_name_price ON products(name, price);

9. 使用了 DISTINCT

问题

  • 在某些情况下,DISTINCT 查询可能会导致 MySQL 不使用索引,尤其是在查询中涉及多个字段时。MySQL 可能会放弃使用索引,而选择全表扫描。

示例

SELECT DISTINCT name FROM products;

解决方案

  • 尽量避免在大表上使用 DISTINCT,或者确保使用合适的索引来提高查询性能。可以考虑通过优化查询条件或者使用聚合函数替代 DISTINCT

10. 查询没有使用 EXPLAIN 进行分析

问题

  • 如果没有使用 EXPLAIN 分析查询执行计划,可能会忽略索引失效的潜在问题,导致查询效率低下。

解决方案

  • 使用 EXPLAINEXPLAIN ANALYZE 来查看查询的执行计划,确保查询使用了合适的索引。
EXPLAIN SELECT * FROM products WHERE name = 'iPhone';

总结

以下是导致 MySQL 索引失效的常见原因和解决方案:

原因解决方案
使用 !=<> 操作符避免使用 !=<>,改用 >, <NOT IN 来优化查询
使用 OR 连接多个条件使用 UNION 替代 OR,避免多个条件查询
对索引列进行函数操作避免在索引列上使用函数,考虑使用计算列
使用 LIKE 前置通配符避免前置通配符 %,或使用全文索引
数据类型不匹配确保查询时条件的数据类型与索引字段一致
使用 IS NULLIS NOT NULLNULL 值列进行优化,避免查询大量 NULL
索引选择性差创建更高选择性的索引或复合索引
没有合适的索引根据查询需求创建适当的索引
使用 DISTINCT避免在大表上使用 DISTINCT,优化查询条件
未使用 EXPLAIN 分析查询执行计划使用 EXPLAIN 分析查询,确保索引有效

通过避免上述常见问题和优化查询结构,可以有效地提升 MySQL 查询的性能,确保索引的有效性。

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

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

相关文章

SD卡恢复数据:快速找回丢失文件!

由于其小尺寸和便携性&#xff0c;SD卡作为外部存储设备在用户中广泛应用。它适用于各种设备&#xff0c;例如数码相机、摄像机、音乐播放器、手机、电视、无人机等。 但是&#xff0c;与其他类型的存储设备一样&#xff0c;SD卡很精致&#xff0c;使用一段时间后可能会出现程…

OpenStack系列第四篇:云平台基础功能与操作(Dashboard)

文章目录 1. 镜像&#xff08;Image&#xff09;添加镜像查看镜像删除镜像 2. 卷&#xff08;Volume&#xff09;创建卷查看卷删除卷 3. 网络&#xff08;虚拟网络&#xff09;创建网络查看网络删除网络 4. 实例类型创建实例类型查看实例类型删除实例类型 4. 密钥对&#xff08…

HTML——43.创建表格

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>表格</title></head><body><!--table标签用来定义表格&#xff0c;border属性表示边框--><!--tr标签表示表格中的一行--><!--th标签表示表…

Sony偏振传感器加持 Blackfly S工业相机突破视觉成像反光难题【51camera】

为什么采用传感器偏振? A: 视觉系统一直都在试图克服玻璃、塑料和金属等反光表面产生的动态或多余光线、反射、朦胧和眩光影响。Teledyne FLIR的Blackfly S 机器视觉工业相机具有 Sony 的传感器偏振和 Spinnaker SDK 内置的防眩光功能&#xff0c;提供便于实施、轻量化且可靠…

Linux上安装配置单节点zookeeper

直接先去官网下载安装包&#xff0c; https://downloads.apache.org/zookeeper/ 选择合适的版本&#xff0c;然后上传至服务器 解压&#xff1a; tar -zxvf apache-zookeeper-3.9.3-bin.tar.gz创建data和logs目录 mkdir data mkdir logs配置环境变量&#xff1a; vim /etc/p…

零基础入门指针的应用

对于我这个非计算机专业的人来说&#xff0c;指针真的很让我头疼&#xff0c;该如何理解指针、如何使用指针是我的痛点&#xff0c;但是在嵌入式中又会经常用的到&#xff0c;所以本文将介绍该如何求使用指针。 一、指针的概念 什么是指针&#xff1f;指针就是编程语言中的一个…

Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(1):Oracle Dataguard 概述

Oracle Dataguard&#xff08;主库为 Oracle 11g 单节点&#xff09;配置详解&#xff08;1&#xff09;&#xff1a;Oracle Dataguard 概述 目录 Oracle Dataguard&#xff08;主库为 Oracle 11g 单节点&#xff09;配置详解&#xff08;1&#xff09;&#xff1a;Oracle Data…

Java开发生态2024年度总结报告

1 关键要点 尽管数据显示 Java 17 是最常用 JDK&#xff0c;但其用户占比并未超过半数。根据 New Relic 2024 Java 生态系统状态报告&#xff0c;Java 17、11 和 8 的用户比例分别为 35%、33% 和 29%。New Relic 数据中所谓“快速采用”指 Java 21 的采用率仅为 1.4%。虽相较 J…

PlasmidFinder:质粒复制子的鉴定和分型

质粒&#xff08;Plasmid&#xff09;是一种细菌染色体外的线性或环状DNA分子&#xff0c;也是一种重要的遗传元素&#xff0c;它们具有自主复制能力&#xff0c;可以在细菌之间传播&#xff0c;并携带多种重要的基因(如耐药基因与毒力基因等)功能。根据质粒传播的特性&#xf…

277-基于八路256Ksps 24bit AD生物电震动检测FMC子卡

一、板卡概述 板卡基于AD7768 AD芯片设计的八路低速采集的FMC 子卡&#xff0c;支持直流耦合&#xff0c;产品应用于生物电、脑电波、声音&#xff0c;震动等信号采集。 二、板卡参数及性能 板卡功能 参数 内容 ADC 芯片型号 AD7768 路数 8路ADC&#xff0c; 采样率 2…

[TOTP]android kotlin实现 totp身份验证器 类似Google身份验证器

背景&#xff1a;自己或者公司用一些谷歌身份验证器或者microsoft身份验证器&#xff0c;下载来源不明&#xff0c;或者有广告&#xff0c;使用不安全。于是自己写一个&#xff0c;安全放心使用。 代码已开源&#xff1a;shixiaotian/sxt-android-totp: android totp authenti…

耳切法简述

耳切法简述 将简单多边形分解成三角形称为多边形的三角剖分。对n个顶点的简单多边形的任何三角剖分都有n-2个三角形。其中最简单的算法&#xff0c;称为耳切法&#xff08;EarClipping&#xff09;。 耳的定义 多边形的一个 “耳” 是由 V i 0 V_{i_{0}} Vi0​​、 V i 1 V_…

国内外大模型以及部署

国内15家AI大模型应用盘点 AI大模型 秘塔AI搜索 秘塔AI搜索免登录&#xff0c;免费的问答大模型。 开源大模型 Ollama Ollama是一个专注于提供 大语言模型&#xff08;LLM&#xff09; 本地化部署和运行的工具和资源的平台。它旨在帮助用户轻松地在自己的设备上运行和定制…

2024年终总结:非常充实的一年

一、业务方面 2024年是业务全面拓展与技术深耕的一年。从日常的开发维护到新产品研发&#xff0c;从降本增效到业务创新&#xff0c;每一步都在不断累积成长。以下是我的年度业务总结&#xff1a; 日常工作&#xff1a;聚焦于软件开发、维护、运营和售后工作&#xff0c;同时…

UE5材质节点VertexNormalWs/PixelNormalWS

VertexNormalWs顶点法线方向&#xff0c;此节点可以做物体上积雪、青苔等效果 PixelNormalWS像素法线方向

MAC环境安装(卸载)软件

MAC环境安装&#xff08;卸载&#xff09;软件 jdknode安装node&#xff0c;并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净&#xff0c;可以再细分删除验证删除结果 jdk 1.下载jdk 先去官网下载自己需要的版…

玩具租赁系统设计与实现(文末附源码)

博主介绍&#xff1a;✌全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLM…

C403 unity打开方法

1 unity hub右键以管理员方式打开。 2 注册登录账户 如果出现 如果还是不行&#xff0c;把地址栏的网址复制&#xff0c;在google浏览器中打开 如果出现安全策略&#xff0c;就不勾选安全防护 尝试方案1 把unityhub在任务管理器中关闭 如果验证码发送成功&#xff0c;还是进不…

log4j2的Strategy、log4j2的DefaultRolloverStrategy、删除过期文件

文章目录 一、DefaultRolloverStrategy1.1、DefaultRolloverStrategy节点1.1.1、filePattern属性1.1.2、DefaultRolloverStrategy删除原理 1.2、Delete节点1.2.1、maxDepth属性 二、知识扩展2.1、DefaultRolloverStrategy与Delete会冲突吗&#xff1f;2.1.1、场景一&#xff1a…

【记录】vue 添加全局 dialog 弹框

页面展示 代码 /components/GlobalDialog/index.vue <template><div class"global_dialog" v-if"isVisible"><div class"global_dialog_header"><div class"global_dialog_header_title">{{ title }}</d…