【MySQL】一次线上的OR查询导致的索引失效 附解决方案

MySQL性能优化MySQL索引失效的13种隐蔽场景排查及解决方法 通过以上隐蔽场景的分析,我们可以看到 MySQL 索引失效的原因多种多样。在实际应用中,我们需要仔细分析查询语句,确保索引被正确使用。通过合理创建索引、优化查询语句和使用 EXPLAIN 命令分析查询计划,可以有效避免索引失效,提高数据库的性能。希望本文的内容对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言。 阅读详情

MySQL索引失效及解决

问题发现

MySQL是一款出色的关系型数据库,在互联网行业中应用广泛。但是MySQL经常是后端开发的瓶颈,因此开发中经常涉及到MySQL的优化。建立索引是一种常见且有效的方式,但是不走索引的情况如何排查解决呢?

 EXPLAIN
 SELECT COUNT(DISTINCT(s.order_id)) AS order_count,SUM(s.estimate_cos_price) AS order_amount,
				date(s.created_date) AS order_time
 FROM order_sku_detail s
 LEFT JOIN union_order u
 ON s.order_id=u.order_id
 WHERE (u.valid_code = 16 OR u.valid_code = 17) AND s.delete_status = 0
 AND u.delete_status = 0;

执行计划结果为:
chuxlu@163.com
经过排查,将SQL语句中OR条件删除,改成

 WHERE u.valid_code = 16  AND s.delete_status = 0
 AND u.delete_status = 0;

重新开始执行计划,发现走了索引:
chuxlu@163.com

问题解决

既然发现了是OR查询条件导致的索引失效,就开始查阅资料,发现很多人都有遇到类似的问题,同时也有很多了给了解决方案用IN替代,于是将查询条件修改为:

 WHERE u.valid_code IN (16,17)
 AND s.delete_status = 0
 AND u.delete_status = 0;

对应的执行计划:
chuxlu@163.com
通过执行计划,可以发现,修改为IN查询依然没有起作用。
但是执行时间效率提高了很多,如下图所示:
在这里插入图片描述
并且这只是OR连接了两个条件,若是多个条件的话,OR的查询效率会下降更多。实际开发中采用IN查询效率要远远高于OR查询。

[参考阅读]:MySQL的in语句和or哪个执行效率更高?

从零开始用QP框架开发STM32:事件驱动编程实战指南(附状态机设计技巧) 本文详细介绍了如何使用QP框架在STM32上实现事件驱动编程,包括状态机设计技巧和嵌入式开发实践。通过对比传统前后台系统和RTOS,展示了QP框架在资源占用、实时性和代码可维护性方面的优势,并提供了从环境搭建到高级状态机设计的完整指南。 阅读详情

相关推荐

ADRV9009的学习历程(一)

** AD9361的同胞ADRV9009 ** 终于记录一下了 距离第一次想写博客记录自己学习的点点滴滴,大概已经过去有一年有余。一直都是停留在心有余而力不足的境界。 基本每次做项目遇到问题都会来优快云寻求帮助,这里虽离庙堂较远,但高手云集。每每读来,思绪万千,次次膜拜。 趁这次又学习了一样新物件,就记录一下,望大神看见能赐教一下。 ADRV9009 最近有项目要用到ADRV9009这个芯片。就来学习一下。做过AD9361的都知道,ADI官方会给出这个芯片的参考手册、数据手册和驱动程序。当然我只是见过AD

weixin_42868560的博客 1万+

MySQL 使用 OR 条件导致索引失效

MySQL 使用 OR 条件导致索引失效,及其解决方案

yyp_abcd的博客 7365

别再被systemd-resolved坑了!银河麒麟V10下用Bind9搭建内网DNS的完整避坑指南

本文详细介绍了在银河麒麟V10和Ubuntu系统下部署Bind9 DNS服务器时,如何解决与systemd-resolved的端口冲突问题。提供了五种专业级解决方案,包括彻底禁用systemd-resolved、智能端口转发等,并特别针对银河麒麟V10的安全加固需求给出了配置建议和诊断工具,帮助用户高效搭建内网DNS服务。

weixin_30342209的博客 655

索引覆盖与回表

懂的越多,不懂的越多 上回书说到:什么情况下,索引下推没办法提高sql查询效率? 表 info 主键 id 名称 name 值 value 别名 realname 对于info表,我们现在有(name,value)联合索引

AF_0228的博客 6173

腾讯文档API逆向分析:不用Selenium也能批量导出的黑科技

本文揭秘了如何通过Python逆向分析腾讯文档的隐藏API,实现无需Selenium即可批量导出在线表格的高效方法。详细解析了API调用流程、Cookie维护及异常处理技巧,相比传统方案性能提升显著,适用于大量文档导出的自动化场景。

h9j8k7l6m5n的博客 1201

实验六 存储器实验

只读存储器(ROM)是一种在正常工作时其存储的数据固定不变,其中的数据只能读出,不能写入,即使断电也能够保留数据,要想在只读存储器中存入或改变数据,必须具备特定的条件。当地址为00000101时,会分别在数据位宽为8,16,32的只读寄存器中找到地址为00000101所对应的十进制地址位置,也就是地址为5的数据,并将其分别以8位,16位,32位输出。因此,输出保持为0。因此,当异步清零信号为1时,无论其他输入信号是什么,触发器的输出都会被强制清零,输出为0。1)寄存器输入0011,使能端1,异步清零0。

wenmou1111的博客 3003

MySQL索引问题

索引

weixin_45804141的博客 1233

Android-音频配置文件详解

前言:   Android P 引入了一种新的音频政策配置文件格式 (XML),用于描述音频拓扑。新的 XML 文件支持定义输出输入流配置文件、可用于播放和捕获的设备以及音频属性的数量和类型。但是每个项目的代码里面都有很多音频配置文件,具体使用的是哪个文件呢?本文将详细讲述。 1. 查看运行时具体使用的xml adb shell dumpsys media.audio_policy | grep -iE "Config source:" 结果如下: Config source: /vendor

cheriyou_的博客 3946

高性能的Mysql读书笔记系列之五(创建高性能的索引)

前言: 正文: 总结:

jdk_wangtaida的博客 2095

Joule 终于会说 ABAP 了:从 ADT 提效到 ABAP AI SDK + ISLM 自建企业级 AI 场景的落地路线

生成结构化摘要(故障现象、初步原因、处理动作、备件消耗)自动给出建议分类(电气、机械、软件、网络)把摘要回写到工单抬头,方便后续统计与知识沉淀如果你用 CAP 来做这类服务,通常会在 Node.js 层封装一个对 AI Hub 的调用,再通过 OData 或 Event 把结果写回 SAP。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 342

[特殊字符] 从零构建携程/飞猪机票价格爬虫:Python异步抓取与反爬对抗实战

在出行决策、竞品分析、价格预测模型训练等场景中,稳定获取携程(Ctrip)和飞猪(Fliggy)的实时机票价格波动数据是刚需。然而,这两大平台均部署了业界顶尖的反爬体系——包括但不限于:动态请求签名(SignToken设备指纹采集(UACanvasWebGL接口参数加密(X-Sign_abtestcookie混淆)频率限制与 IP 封禁(滑动窗口 + 行为检测)目录前言:为什么需要自建机票价格爬虫?一、技术选型与项目架构1.1 核心技术栈1.2 系统架构图(文字描述)1.3 法律与道德声明。

2201_76125261的博客 339

MySQL进阶【二】—— 一文讲清楚为什么MySQL选择B+树索引

MySQL的几种索引结构 https://www.cs.usfca.edu/~galles/visualization/BST.html 数据结构的一个学习网站 B树 B树在MySQL的结构 1、叶子节点具有相同的深度,叶子阶段的指针都为空 2、叶子节点和跟节点,均挂有数据块(因所有节点都挂有数据块,大大降低了索引树存储索引的数量) 3、所有索引不重复 4、节点从左到右是递增的 Hash 1、数组+链表的实现方式(与Java中的hashmap类似) 2、对索引key进行一次hash运算就可以

shehuinidaye的博客 926

【图像处理】德里奇( Deriche)边缘检测器

Deriche边缘检测,同canny算法齐名,因此,知道canny原理,也有必要知道德里奇的检测原理。本篇专门针对德里奇算法展开讨论。

gongdiwudu的专栏 8683

MySQL中OR操作导致索引失效的深度解析与技术优化方案

以InnoDB引擎为例,其默认页大小为16KB。假设索引键为INT类型(4字节),指针6字节,则单个节点可存储约16KB/(4+6)=1600个键值,3层B+树即可支撑千万级数据量。MySQL采用B+树作为核心索引结构,其平衡多路搜索树的特性保证了O(logN)的查询效率。此时优化器应选择索引合并,但实际可能因统计信息不准导致误判。表明优化器选择全表扫描,OR条件导致索引失效。这种转换导致优化器难以使用单一索引。而OR条件会破坏索引的最左前缀原则。高选择性的列更适合创建索引。

qq_35082497的博客 1347

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数据库查询导致索引失效情况

查询age and classId and name时,(age,classId,name)索引比(age,classId)快。联合索引把频繁查询的列放左。索引(a,b,c),只能查(a,b,c),(a,b),(a)。如果主键不自增,需要查找目标位置再插入,并且如果目标位置所在数据页满了就必须得分页,造成性能损耗。计算例如where num+1=2,函数例如abs(num)取绝对值例如name=123,而不是name='123'。又例如使用了不同字符集。

精神小牛马 2258

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MySQL中什么情况下会出现索引失效?如何排查索引失效?

在MySQL中,索引是用来加快检索数据库记录的一种数据结构。索引失效指的是在进行查询操作时,本应该使用索引来提升查询效率的场景下,数据库没有利用索引,而是采用了全表扫描的方式,这会大大增加查询时间和系统负担。MySQL中什么情况下会出现索引失效?如何排查索引失效?回答。

weixin_44382896的博客 8201

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

记一次 MySQL JSON 字段索引失效,导致的百万级数据查询雪崩事故复盘

你是否在项目中用过 MySQL 的 `JSON` 字段?它灵活好用,但稍有不慎就可能埋下巨大的性能地雷。本文以“默语”博主的身份,复盘一次因 `JSON` 字段索引设计不当,导致线上百万级数据查询变慢,最终引发连锁反应导致服务雪崩的真实事故。文章将从现象、排查、原理到最终解决,手把手带你走一遍排查流程,深入浅出地讲解 MySQL `JSON` 索引的核心知识点,让你彻底搞懂这个“最熟悉的陌生人”,避免重蹈覆辙。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 2732

MySQL索引失效的12种场景及解决方案

索引优化是一个持续的过程,需要结合具体的业务场景和数据特点。通过了解这些索引失效的场景和原理,你可以更有针对性地设计索引策略,显著提升数据库性能。没有一劳永逸的索引方案,随着数据量的增长和业务的变化,索引策略也需要不断调整和优化。持续监控、分析和优化是保持高性能数据库的关键。

风象南的专栏 4122

MySQL索引系列--索引失效的原因/解决方案

本文介绍数据库什么时候会索引失效以及如何避免索引失效。 这个问题也是Java后端面试中常见的问题。

IT利刃出鞘的博客 1万+

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

在实际应用中,我们应该根据查询模式和业务需求来合理设计索引,并编写高效的SQL查询语句。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 7358

MySQL - 索引失效的 10 种常见场景,你踩坑了

MySQL 索引失效的 10 种常见场景 本文深入分析了 MySQL 索引失效的典型问题,包括: 对索引字段使用函数或表达式 隐式类型转换 LIKE 以通配符开头 联合索引不符合最左前缀原则 使用 OR 条件不当 索引列参与运算 使用 NOT IN 或 != 操作 索引列使用 IS NULL 判断 数据量过小时优化器放弃索引 索引统计信息不准确 每种场景都提供: 问题复现SQL EXPLAIN分析 Java代码正反案例 解决方案 通过实际案例揭示索引失效原理,帮助开发者避免性能陷阱,提升查询效率。文章包含可

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

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

本文将介绍mysql有哪些索引,索引失效有哪些原因,以及sql执行顺序

一名后端程序猿 6776

MySQL 动态查询条件导致索引失效如何优化?

文章从一名具有八年经验的 Java 开发者视角出发,结合真实业务场景,深入浅出地剖析了 MySQL 动态查询如何导致索引失效,并提供了 Java 实战方案,**包括 MyBatis 动态 SQL 编写及优化技巧**,并配套注释详尽的代码示例。

Minoz_wl的博客 729

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

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

每日一贴 1170

MySQL索引失效原因及解决方案

在使用MySQL数据库时,索引是一种重要的性能优化工具。然而,有时候我们可能会遇到索引失效的情况。本文将介绍几种常见的MySQL索引失效原因以及相应的解决方案,并提供SQL语句的错误示例和正确示例。

Java老兵的后端进阶与AI前沿探索之路。 4173

Mysql 索引失效详解

索引失效的原因可以多种多样,通常是由于查询条件的特殊使用方式导致MySQL不能有效利用索引。要避免索引失效,应该尽量避免使用导致失效的操作符(如ORLIKE %开头、函数、NOT等),合理选择查询的条件列,并确保索引的有效使用。

qq_35082497的博客 1735
上一篇: 【排序】堆排序详解 附代码
下一篇: 【性能优化】两种方案优化双层for循环语句 附代码和实例
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值