当前位置: 首页 > 编程日记 > 正文

sql的不等于条件优化_SQL优化案例(2):OR条件优化

随后上一篇文章《 SQL优化案例(1):隐式转换》的介绍,此处内容围绕OR的优化展开。

在MySQL中,同样的查询条件,如果变换OR在SQL语句中的位置,那么查询的结果也会有差异,在多个复杂的情况下,可能会带来索引选择不佳的性能隐患,为了避免执行效率大幅度下降的问题,我们可以适当考虑使用Union all对查询逻辑复杂的SQL进行分离。

常见OR使用场景,请阅读以下案例。

案例一:不同列使用OR条件查询

1.待优化场景

SELECT....     FROM`t1` a  WHERE a.token= '16149684'         AND a.store_id= '242950'          AND(a.registrationId IS NOT NULL          AND a.registrationId<> '')              OR a.uid= 308475          AND a.registrationId IS NOT NULL          AND a.registrationId<> ''

执行计划

+--------------+-----------------------+-----------------+----------------+-------------------+-------------------+---------------+----------------+---------------------------------------------+ | id           | select_type           | table           | type           | key               | key_len           | ref           | rows           | Extra                                       |+--------------+-----------------------+-----------------+----------------+-------------------+-------------------+---------------+----------------+---------------------------------------------+ | 1            | SIMPLE                | a               | range          |idx_registrationid | 99                |               | 100445         | Using index condition; Using where          |+--------------+-----------------------+-----------------+----------------+-------------------+-------------------+---------------+----------------+---------------------------------------------+

共返回1行记录,花费 5 ms 。

2.场景解析

从查询条件中可以研磨令牌和uid过滤性都非常好,但是由于使用了,或者,需要采用索引合并的方法才能获得比较好的性能。但在实际执行过程中MySQL优化器替代选择了使用registrationId的索引,导致SQL的性能很差。

3.场景优化

我们将SQL改写成union all的形式。

SELECT ... ...FROM`t1` aWHERE a.token = '16054473'AND a.store_id = '138343'AND b.is_refund = 1AND (a.registrationId IS NOT NULLAND a.registrationId <> '')union allSELECT......FROM`t1`awhere a.uid = 181579AND a.registrationId IS NOT NULLAND a.registrationId <> ''
+--------------+-----------------------+-----------------+----------------+------------------------------+---------------+-------------------+------------------------------+----------------+------------------------------------+ | id           | select_type           | table           | type           | possible_keys                | key           | key_len           | ref                          | rows           | Extra                              |+--------------+-----------------------+-----------------+----------------+------------------------------+---------------+-------------------+------------------------------+----------------+------------------------------------+ | 1            | PRIMARY               | a               | ref            | IDX_TOKEN,IDX_STORE_ID_TOKEN | IDX_TOKEN     | 63                | const                        | 1              | Using index condition; Using where | | 1            | PRIMARY               | b               | eq_ref         | PRIMARY                      | PRIMARY       | 4                 | youdian_life_sewsq.a.role_id | 1              | Using where                        | | 2            | UNION                 | a               | const          | PRIMARY                      | PRIMARY       | 4                 | const                        | 1              |                                    | | 2            | UNION                 | b               | const          | PRIMARY                      | PRIMARY       | 4                 | const                        | 0              | unique row not found               | |              | UNION RESULT          |       | ALL            |                              |               |                   |                              |                | Using temporary                    |+--------------+-----------------------+-----------------+----------------+------------------------------+---------------+-------------------+------------------------------+----------------+------------------------------------+

共返回5行记录,花费 5 ms 。

通过对比优化前后的执行计划,可以明显修剪,将SQL合并成两个子查询,再使用union对结果进行合并,稳定性和安全性更好,性能更高。

案例二:同一列使用OR查询条件

1.待优化场景

a2b47baab22b8ee8c4aadfde7b553246.png

执行计划

7340283fae9475a41cd6d9f9f47bb518.png

2.场景解析

本例的SQL查询中有一个子查询,子查询被当成成驱动表,产生了auto_key,通过SQL进行进行测试,验证主要是(pc.count = 0或pc.count为null)会影响到整个SQL的性能,需要进行比较改写。

3.场景优化

首先我们可以单独思考(pc.count = 0或pc.count为null)如何进行优化?先写一个类似的SQL

d9e74a50e66a62ebd42b876ae9223498.png

这个时候我们看到的其实是同一个列,但对应不同的值,这种情况可以利用case when进行转换。

8bc77c1e181a599bff66afb20467d1ed.png

再回到原始SQL进行改写。

5c6edcbfa02cb670459892e4657be52a.png
ccb43b33418d783cb8ced16c6afb984d.png

可以抛光优化后的SQL比原始SQL快了30秒,执行效率提升约50倍。

案例三:优化关联SQL OR条件

1.待优化场景

SELECT user_msg.msg_id AS ‘msg_id’, user_msg.content AS ‘msg_content’, …FROM user_msgLEFT JOIN user ON user_msg.user_id = user.user_idLEFT JOIN group ON user_msg.group_id = group.group_idWHERE user_msg.gmt_modified >= date_sub('2018-03-29 09:31:44', INTERVAL30SECOND)OR user.gmt_modified >= date_sub('2018-03-29 09:31:44', INTERVAL 30 SECOND)OR group.gmt_modified >= date_sub('2018-03-29 09:31:44', INTERVAL 30 SECOND)

2.场景解析

我们仔细分析上述查询语句,发现虽然业务逻辑只需要查询半分钟内修改的数据,但执行过程却必须对所有的数据进行关联操作,带来的性能损失。

28404b025bf2370f233cf6c54a6d2572.png

3.场景优化

我们对原始SQL进行分解操作,第一部分sql-01如下:

SELECT user_msg.msg_id AS ‘msg_id’, user_msg.content AS ‘msg_content’, …FROM user_msgLEFT JOIN user ON user_msg.user_id = user.user_idLEFT JOIN group ON user_msg.group_id = group.group_idWHERE user_msg.gmt_modified >= date_sub('2018-03-29 09:31:44', INTERVAL 30 SECOND)
57f5e46e205b6f062620c325ce4a8b9c.png

sql-01以user_msg表为驱动,使用gmt_modified索引过滤最新数据。

第二部分sql-02如下:

SELECT user_msg.msg_id AS ‘msg_id’, user_msg.content AS ‘msg_content’, …FROM user_msgLEFT JOIN user ON user_msg.user_id = user.user_idLEFT JOIN group ON user_msg.group_id = group.group_idWHERE user.gmt_modified >= date_sub('2018-03-29 09:31:44', INTERVAL 30 SECOND)
ecc0e71841b85cda196f308efe2dfd00.png

sql-02以用户为驱动表,msg user_id的索引过滤行很好。

第三部分sql-03如下:

SELECT user_msg.msg_id AS ‘msg_id’, user_msg.content AS ‘msg_content’, …FROM user_msgLEFT JOIN user ON user_msg.user_id = user.user_idLEFT JOIN group ON user_msg.group_id = group.group_idWHERE group.gmt_modified >= date_sub('2018-03-29 09:31:44', INTERVAL 30 SECOND)
5d6c02431d213d4a51fa18ef5639428d.png

sql-03以group为驱动表,使用gmt_modified索引过滤最新数据。

总结

MySQL OR条件优化的常见场景主要有以下情况:

1,相同列可以使用IN进行代替

2,不同列及复杂的情况下,可以使用union all进行分离

3,关联SQL OR条件

我们需要结合实际场景,分析优化。

相关文章:

所有 SAP 现在开设的标准课程

下面是 SAP 中国的教育培训首页&#xff0c;里面有 SAP 最新最完整的培训教育计划。 http://www30.sap.com/china/services/education/index.epx 从中可以看出&#xff0c;随着 SAP 的发展&#xff0c;BC4xx 系列课程已经发生了很大改变&#xff0c;取消了 BC404、BC406&#x…

动态展开所有_库存与市场需求之间如何“动态”共舞?库存计划动态模型构建分享...

库存(Stock)是用来提高交货速度、缓冲需求到单高峰的常用手段&#xff0c;通过按库存生产(MTS)的方法&#xff0c;用储备库存来满足客户需求、并按一定规则补货&#xff0c;无需等待生产周期&#xff0c;可极快地交付。相比按订单生产(MTO)的模式&#xff0c;采用安全库存可以有…

Linux下DNS简单部署(主从域名服务器)

一、DNS简介 DNS&#xff08;Domain Name System&#xff09;&#xff0c;域名系统&#xff0c;因特网上作为域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使用户更方便的访问互联网&#xff0c;而不用去记住能够被机器直接读取的IP数串。通过主机名&#xff0c;最终…

Neurala与CSDN宣布战略合作,将一站式AI平台BrainBuilder带给中国开发者

11 月 8 日&#xff0c;美国人工智能创新企业 Neurala 与中国开发者社区 CSDN 联合宣布&#xff0c;正式成为战略合作伙伴&#xff0c;通过双方的合作&#xff0c;将 BrainBuilder 平台提供给中国的更多开发者和教育培训机构。Brain Builder 是 Neurala 开发的一站式 AI 平台。…

使用idea创建springboot项目并打成war包发布到weblogic上...

部署tomcat也是类似的&#xff0c;但是需要注意项目配置的路径&#xff0c;或者直接将项目放到webapp的ROOT目录下。 使用工具&#xff1a;intelliJ IDEA2016.3&#xff0c; jdk1.8 &#xff0c;weblogic12 一 使用idea创建springboot项目 File-》New -》Project 选择jdk版本…

cs架构嵌入bs_CS与BS架构区别、比较、及现状与趋势分析

一、简介 CS即Client/Server(客户机/服务器)结构&#xff0c;C/S结构在技术上很成熟&#xff0c;它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。但是该结构的程序是针对性开发&#xff0c;变更不够灵活&#xff0c;维护和管理的难…

大数据的“平民化”、“流动化”、“商业化”推动企业升级与转型

CSDN 出品的《2018-2019 中国人工智能产业路线图》V2.0 版已经重磅面世&#xff01; V1.0 版发布以来&#xff0c;我们有幸得到了诸多读者朋友及行业专家的鼎力支持&#xff0c;在此表示由衷感谢。此次 V2.0 版路线图进行了新一轮大升级&#xff0c;内容包括 3 大 AI 前沿产业趋…

APIPA是什么?

<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />APIPA&#xff08;Automatic Private IP Addressing&#xff0c;自动专用IP寻址自动专用IP寻址&#xff09;&#xff0c;是一个DHCP故障转移机制。当DHCP服务器出故障时&#xff…

birt报表表格边框_手把手教你五步制作出一张领导驾驶舱报表

领导驾驶舱报表是一款为企业内部领导及相关高管提供企业数据指标分析的报表&#xff0c;用来实时反映企业的运行状况&#xff0c;将企业管理决策提升到一个新的高度。今天小编用亿信华辰的亿信ABI给大家实际演示&#xff0c;通过5个步骤就可以刷刷刷“变”出漂亮的领导驾驶舱&a…

Web的现状:网页性能提升指南

互联网发展非常迅速&#xff0c;所以我们创造了Web平台。通常 我们会忽视连通性等问题&#xff0c;但用户们却不会视而不见 。一瞥万维网的现状&#xff0c;可以发现我们并没有用同情心、变通意识去构建它&#xff0c;更不要说性能了。 所以&#xff0c;今天的Web是什么状态呢?…

[导入]ExtJs 2.0 弹窗事例

网站: JavaEye 作者: ppkosd 链接&#xff1a;http://ppkosd.javaeye.com/blog/133004 发表时间: 2007年10月18日 责任不是你应该做的事情,而是你必须做的事情 -- ppkosd 这个EXT 2.0 的例子 讲的是怎么样用aspserver和ext2.0构建弹窗效果! 服务器部分&#xff1a; 代码va…

双十一报名截止,决赛在即!AI Challenger2018极客峰会免费抢票!

第二届“AI Challenger 全球AI挑战赛”各赛道竞赛经过两个多月的激烈角逐&#xff0c;报名将于北京时间2018年11月11日23:59:59正式截止&#xff0c;随即进入决赛阶段&#xff0c;最终每个竞赛的TOP 5团队将进入12月18、19日在北京举办的总决赛答辩及颁奖礼&#xff0c;角逐超过…

取值范围_从int取值范围谈起

int取值范围我们在面试过程中&#xff0c;或者在准备面试过程中&#xff0c;可能会遇到这样一个问题&#xff1a;Java中int的取值范围是什么&#xff1f;这个问题比较常见&#xff0c;也很简单&#xff0c;相信大部分Java开发人员都可以快速答上来&#xff1a;[ , ]即使不能马上…

MonoRail学习笔记五:定制服务实现自定义功能

在上一篇MonoRail学习笔记四&#xff1a;MonoRail基本流程分析中我提到&#xff0c;MonoRail中可以自定义一些服务。比如可以定义自己的Url解析类&#xff0c;来实现http://localhost:***/index.rails等http://localhost:***/*.rails的效果。具体步骤如下&#xff1a;1、修改we…

我的第一个vb实例--红楼梦测试小程序

http://files.cnblogs.com/gengxiaochao/hlmtest.rar 转载于:https://www.cnblogs.com/gengxiaochao/archive/2007/11/26/973072.html

2018 AI产业投融资分析:热钱涌向何处,谁的“寒冬”将至?

AI科技大本营按&#xff1a;本篇内容来自由 CSDN 出品的《2018 中国人工智能产业路线图》V2.0 版中 1.4 章投融资分析篇&#xff0c;通过对各大 AI 行业进行相关数据分析&#xff0c;我们尽可能勾勒出中国 AI 产业发展现状&#xff0c;并对行业未来做出趋势判断。产业路线图 2.…

mvc的宿舍管理系统源码 基于jsp_[源码和文档分享]基于JSP的MVC框架实现的图书推荐系统展示平台网站...

推荐系统是目前互联网中最常见的一种智能产品形式。由于网络中信息量的快速增长以及图书出版行业出版量的攀升&#xff0c;人们需要一种办法&#xff0c;来解决信息过载的问题。此外&#xff0c;用户访问网络是为了获取信息&#xff0c;但并不是所有的访问都有很强的目的性&…

Ms Sql Server 基本管理脚本(1)

/* *登录帐户管理*/--授予Windows账号test访问数据库的权限exec sp_grantlogin teacher-jin\test--拒绝Windows账号test访问数据库的权限exec sp_denylogin teacher-jin\test--回收Windows账号test访问数据库的权限exec sp_revokelogin teacher-jin\test--授予Windows组users访…

配置Android开发环境(fedora)

配置Android开发环境&#xff08;fedora) 最进看见google的Android&#xff0c;体会了下&#xff0c;按照官网上的配置了下&#xff0c;后编了个Hello Android结果发现没能传到模拟器上&#xff1b;于是在windows xp上试了下&#xff0c;没问题。那么为什么会有问题呢&#xff…

精选Python开源项目Top10!

作者 | MyBridge译者 | Linstancy整理 | Jane出品 | AI科技大本营【导读】过去一个月里&#xff0c;我们对近 250 个 Python 开源项目进行了排名&#xff0c;并挑选出热度前 10 的项目。这份清单的平均 github star 数量高达 1140&#xff0c;涵盖了包括性能分析、提取 PDF 中的…

全局声明宏定义_Rust语言:元编程,强大的宏系统,菜鸟到高手进阶的必经之路...

编程语言的宏操作&#xff0c;在C和C早期就已经存在。宏可以将重复的代码用更简短的宏函数替换&#xff0c;编译过程中再展开&#xff0c;使得代码编写的更简洁。Rust提供了两种宏&#xff0c;分别是声明宏和过程宏。声明宏的形式和C的宏替换类似&#xff0c;区别在于Rust会对宏…

SpringBoot 1024行代码 - 系统监控工具 Actuator简介

前言 在生产环境中&#xff0c;我们比较关心任意时刻一个JVM的运行情况。SpringBoot为我们提供了一个方便的功能模块Actuator。只要简单几步就可以为我们的应用添加查询系统各项指标的功能。 准备工作 完成SpringBoot 1024行代码 - Getting Started&#xff08;一个简单的web应…

新一代宽带路由器—Vigor防火墙路由器

华盖科技隆重推出新一代宽带路由器—Vigor防火墙路由器上网行为管理时代的来临一、网络信息乱七八糟 计算机病毒泛滥、******造成信息丢失&#xff1b;不健康的文字、图片、广告&#xff0c;带有淫秽、、暴力等有害信息的网站、不健康的网络信息影响了网络环境。如何保证信息的…

2018 中国AI人才大调查:14张图表解读他们来自何处,又将去往何方?

AI科技大本营按&#xff1a;本篇内容来自由 CSDN 出品的《2018 人工智能产业路线图》V2.0 版中 1.6 章人才分析篇&#xff0c;通过对相关 AI 人才各维度的数据分析&#xff0c;我们尽可能勾勒中国 AI 人才发展的全景面貌。产业路线图 2.0 完整版我们将很快提供读者下载&#xf…

用这个Python库,训练你的模型成为下一个街头霸王!

作者 | MJ-Murray 译者 | 孤鸿 整理 | Jane 出品 | AI科技大本营 从世界瞩目的围棋游戏 AlphaGo&#xff0c;近年来&#xff0c;强化学习在游戏领域里不断取得十分引人注目的成绩。自此之后&#xff0c;棋牌游戏、射击游戏、电子竞技游戏&#xff0c;如 Atari、超级马里奥、…

bat curl 返回值_bat curl 发送http请求 监控网站

标签&#xff1a;batecho offcolor 1ftitle 正在监控 www.0579ld.com.cnecho 正在监控 www.0579ld.com.cn(23.247.53.3)..:aaaD:\curl\curl -I www.0579ld.com.cn>nulset str%ERRORLEVEL%if not "%str%""0" (echo 在%date% %time:~0,5% 无法正常访问&am…

C2:抽象工厂 Abstract Factory

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 应用场景: 一系列相互依赖的对象有不同的具体实现。提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合 UML: 代码示例: abstract class AbstractProductA { }abstract class A…

C#如何向EXCEL写入数据

C#如何向EXCEL写入数据 我按着微软技术支持网上的方法写入数据&#xff1a;使用“自动化”功能逐单元格传输数据&#xff0c;代码如下&#xff1a; // Start a new workbook in Excel. m_objExcel new Excel.Application(); m_objBooks (Excel.Workbooks)m_objExcel.Workbook…

写注册机犯法吗_逼着一个受害者去向另一个受害者道歉,不过分吗?

有一个姑娘&#xff0c;特别漂亮&#xff0c;笑容迷人&#xff0c;身姿绰约&#xff0c;才华横溢&#xff0c;琴棋书画&#xff0c;样样精通&#xff0c;饱读诗书&#xff0c;温婉贤德。大多数见过这女子之人&#xff0c;无不为之倾倒。很多人&#xff0c;为了一睹姑娘之貌&…

用正则表达式替换示例

stringDemo Regex.Replace("20071220", "(d{4})(d{2})(d{2})", "$1-$2-$3 23:59:59")