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

news2025/1/4 14:31:20

文章精选推荐

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 查询的性能,确保索引的有效性。

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

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

相关文章

HTML——38.Span标签和字符实体

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>span标签和字符实体</title><style type"text/css">h1{text-align: center;}p{text-indent: 2em;}span{color: red;}</style></head><…

DAC8562的详细介绍

DAC8562的详细介绍 DAC8562是一款由德州仪器(Texas Instruments, TI)生产的高精度、低功耗的数模转换器(DAC),专为工业自动化、仪器仪表、医疗设备及消费电子等应用设计。以下是关于DAC8562芯片的详细介绍: DAC8562芯片的SPI接口配置主要包括以下几个方面:

计算机找不到xinput1_3.dll无法执行怎么办?电脑缺失xinput1_3.dll文件怎么修复?

当计算机提示找不到xinput1_3.dll文件&#xff0c;导致某些程序或游戏无法执行时&#xff0c;可以采取以下步骤来修复这个问题&#xff1a; 一、了解xinput1_3.dll文件 xinput1_3.dll是Microsoft DirectX for Windows的控制模块&#xff0c;它包含了一组函数和数据结构&#…

如何在谷歌浏览器中设置屏幕保护

在日常使用电脑的过程中&#xff0c;屏幕保护功能是一项非常实用的功能&#xff0c;它可以在我们暂时离开时保护隐私并节省能源。对于谷歌浏览器用户来说&#xff0c;了解如何设置和调整屏幕保护程序同样重要。本文将详细介绍如何在谷歌浏览器中设置屏幕保护&#xff0c;确保您…

mybatis 和 mybatisPlus 兼容性问题

项目采用的是 mybatis&#xff0c; 后续引入了 mybatisPlus&#xff0c;用 mybatisX 创建的四个类一直报错&#xff0c;提示找不到符号&#xff0c;意识到 mybatis 和 mybatisPlus 的兼容性问题&#xff0c;通过修改配置 两者的配置如下 #配置mybatis配置 mybatis:type-aliase…

WPF中数据绑定模式解析

背景&#xff1a;复习一下 -- 写的代码界面大概就是这样&#xff0c;TextBox和Slider空间&#xff0c;TextBox的Text属性绑定上Slider控件的Value。 Mode中的 1.OneTiem&#xff0c;Slider对TextBox中的数值只影响一次 2.OneWay&#xff0c;Slider对TextBox数值单向影响 3.One…

树莓派OpenWrt下怎么驱动带USB的摄像头

环境&#xff1a;使用VirtualBox虚拟机下安装的ubuntu22.04 LTS操作系统 安装编译需要的插件&#xff1a; sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \ bzip2 ccache cmake cpio curl device-tree-compiler fas…

百度热力图数据获取,原理,处理及论文应用

目录 0、示例数据1、百度热力图数据日期如何选择1.1、看日历1.2、看天气 2、百度热力图几天够研究&#xff1f;部分文章统计3、数据原理3.1.1 定位都包含哪些数据&#xff1f;3.1.2 ** 这个比较重要&#xff0c;后面还会再次出现。核密度的值怎么理解&#xff1f;**3.1.3 Csv-&…

如何确保Kafka集群的高可用?

大家好&#xff0c;我是锋哥。今天分享关于【如何确保Kafka集群的高可用&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何确保Kafka集群的高可用&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 要确保 Kafka 集群 的高可用性&#xff0c;需要…

【HarmonyOS之旅】ArkTS语法(二) -> 动态构建UI元素

目录 1 -> Builder 2 -> BuilderParam8 2.1 -> 引入动机 2.2 -> 参数初始化组件 2.3 -> 尾随闭包初始化组件 3 -> Styles 4 -> Extend 5 -> CustomDialog 1 -> Builder 可通过Builder装饰器进行描述&#xff0c;该装饰器可以修饰一个函数&…

理解生成协同促进?华为诺亚提出ILLUME,15M数据实现多模态理解生成一体化

多模态理解与生成一体化模型&#xff0c;致力于将视觉理解与生成能力融入同一框架&#xff0c;不仅推动了任务协同与泛化能力的突破&#xff0c;更重要的是&#xff0c;它代表着对类人智能&#xff08;AGI&#xff09;的一种深层探索。通过在单一模型中统一理解与生成&#xff…

用再生龙备份和还原操作系统(二)

续上篇&#xff1a;用再生龙备份和还原操作系统&#xff08;一&#xff09; 二&#xff0c;用再生龙制作硬盘备份文件&#xff08;也叫镜像文件&#xff09; 将需要备份的硬盘、做好的再生龙工具盘安装到同一台电脑上。开机&#xff0c;进入BIOS设置菜单。选择从工具盘启动。…

重新整理机器学习和神经网络框架

本篇重新梳理了人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;、神经网络&#xff08;NN&#xff09;和深度学习&#xff08;DL&#xff09;之间存在一定的包含关系&#xff0c;以下是它们的关系及各自内容,以及人工智能领域中深度学习分支对比整理。…

Windows安装了pnpm后无法在Vscode中使用

Windows安装了pnpm后无法在Vscode中使用 解决方法&#xff1a; 以管理员身份打开 PowerShell 并执行以下命令后输入Y回车即可。 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser之后就可以正常使用了

django StreamingHttpResponse fetchEventSource实现前后端流试返回数据并接收数据的完整详细过程

django后端环境介绍&#xff1a; Python 3.10.14 pip install django-cors-headers4.4.0 Django5.0.6 django-cors-headers4.4.0 djangorestframework3.15.2 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 总环境如下&#xff1a; Package Version -…

如何在 Ubuntu 22.04 上安装 Webmin 教程

简介 在本教程中&#xff0c;我们将解释如何在 Ubuntu 22.04 服务器上安装 Webmin。 Webmin 是一个功能强大的基于 Web 的控制面板&#xff0c;它允许你通过一个简单的 Web 界面管理服务器的各个方面&#xff0c;例如用户帐户、DNS、防火墙、数据库等等。本指南将引导你完成在…

【一起python】银行管理系统

文章目录 &#x1f4dd;计算机基础概念&#x1f320; 导入模块&#x1f320;定义input_card_info函数&#x1f320; 定义check_password函数&#x1f320;初始化用户字典和欢迎信息&#x1f309; 主循环&#x1f309;开户操作&#x1f309;查询操作&#x1f309;取款操作&#…

【D3.js in Action 3 精译_047】5.2:图形的堆叠(一)—— 图解 D3 中的堆叠布局生成器

当前内容所在位置&#xff1a; 第五章 饼图布局与堆叠布局 ✔️ 5.1 饼图和环形图的创建 5.1.1 准备阶段&#xff08;一&#xff09;5.1.2 饼图布局生成器&#xff08;二&#xff09;5.1.3 圆弧的绘制&#xff08;三&#xff09;5.1.4 数据标签的添加&#xff08;四&#xff09…

自建私有云相册:Docker一键部署Immich,照片视频备份利器

自建私有云相册&#xff1a;Docker一键部署Immich&#xff0c;照片视频备份利器 前言 随着人们手机、PC、平板等电子产品多样&#xff0c;我们拍摄和保存的照片和视频数量也在不断增加。如何高效地管理和备份这些珍贵的记忆成为了一个重要的问题。 传统的云备份虽然方便&…

[微服务] - MQ高级

在昨天的练习作业中&#xff0c;我们改造了余额支付功能&#xff0c;在支付成功后利用RabbitMQ通知交易服务&#xff0c;更新业务订单状态为已支付。 但是大家思考一下&#xff0c;如果这里MQ通知失败&#xff0c;支付服务中支付流水显示支付成功&#xff0c;而交易服务中的订单…