
在一些业务场景中,会使用NOT EXISTS语句确保返回数据不存在于特定集合,部分同事会发现NOT EXISTS有些场景性能较差,甚至有些网上谣言说”NOT EXISTS不走索引”,哪对于NOT EXISTS语句,我们如何优化呢?
以今天优化的SQL为例,优化前SQL为:
SELECT count(1) FROM t_monitor m WHERE NOT exists ( SELECT 1 FROM t_alarm_realtime AS a WHERE a.resource_id=m.resource_id AND a.resource_type=m.resource_type AND a.monitor_name=m.monitor_name)
我们使用LEFT JOIN方式进行优化,优化后SQL为:
SELECT count(1) FROM t_monitor m LEFT JOIN t_alarm_realtime AS a ON a.resource_id=m.resource_id AND a.resource_type=m.resource_type AND a.monitor_name=m.monitor_name WHERE a.resource_id is NULL
优化效果:
优化前执行时间29秒以上,优化后1.2秒,优化提升25倍。
NOT EXISTS真的不走索引么?
查看两种SQL的执行计划!
使用NOT EXIST方式的执行计划:

使用LEFT JOIN方式的执行计划:

从执行计划来看,两个表都使用了索引,区别在于NOT EXISTS使用“DEPENDENT SUBQUERY”方式,而LEFT JOIN使用普通表关联的方式。
推荐看下:为什么索引能提高查询速度?
通过MySQL提供的Profiling方式来查看两种方式的执行过程。
使用NOT EXIST方式的执行过程:

使用LEFT JOIN方式的执行过程:

从执行过程来看,LEFT JOIN方式的主要消耗在Sending data一项上(1.2s),而NOT EXISTS方式主要消耗在executeing和Sending data两项上,受限于Profiling只存放100行记录缘故。
从Profiling中只能看到47个” executeing和Sending data”的组合项(每个组合项约50us),通过执行计划看出,外表t_monitor的数据量为578436行,忽略统计信息不准情况下,使用NOT EXISTS方式应该会产生578436个” executeing和Sending data”的组合项,总计消耗时间=50μs*578436=28921800us=28.92s。
从上面执行过程可以推断出:
使用NOT EXISTS方式的执行性能严重依赖于NOT EXISTS子查询的执行次数即外层查询结果集的数据量。
当外层查询结果集的数据量N较小时执行性能较好,如有N=10执行时间为50μs*10=500us=0.005s,再加上一些额外消耗,执行结果也能在0.01秒或10毫秒内范围,这个响应时间应该能被大部分应用程序接受。
当外层程勋结果集的数据量N较大甚至上千万数据量时,NOT EXISTS的查询性能会变得非常糟糕,甚至会大量消耗服务器IO和CPU资源从而影响其他业务正常运行。
除上述问题外,在优化过程中发现本应该存储相同数据的resource_id列在两个表中定义不同,一表为VARCHAR而另外一表为BIGINT,外部结果集的字段类型和NOT EXIST字表中字段类型不同导致NOT EXISTS子查询中无法使用索引,使得子查询性能较差,最终影响整个查询的执行性能。
京东商城也曾出现过大量类似案例,一些表使用VARCHAR来存放订单号,而另一些表使用BIGINT来存放,在两表进行管理时性能极差,希望研发同事引以为戒。关注公众号J*a技术栈回复m36获取一份MySQL研发军规。
相关学习推荐:mysql视频教程
以上就是MySQL not exists 与索引的关系的详细内容,更多请关注其它相关文章!
# 索引
# 编辑器
# 镜像
# 解锁
# 两种
# 不走
# 查询结果
# 修改密码
# 引以为戒
# 如有
# MySQL
# 广告网站建设费用多少
# 山东省建设工程网站
# 福建关键词排名策略
# B端推广网站有哪些
# 广州网站建设详细教程图
# 昆明网站推广报价
# seo求职信息广告
# 新塘公司网站推广费用
# 景区创意设计网站推广
# seo资料详细
# 执行时间
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化
b站如何管理订阅_b站订阅标签分类管理
《花瓣》创建专辑方法
tiktok国际版入口_tiktok官网网页版链接
macosmonterey系统外接显示器驱动怎么安装_macosmonterey外接显示器驱动与分辨率调整
易车网官网直达入口 易车网在线登录入口
可米酷漫画在线阅读入口_ 可米酷漫画官网直达链接
J*aScript对象中深度嵌套URL键的查找与更新策略
《sketchbook》选中部分图案移动方法
如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色
《图怪兽》退出登录方法
如何使用 Optional 类型并满足 Pylint 的类型检查
Yandex浏览器官方入口_Yandex搜索引擎中文版
t3出行如何使用微信支付
VS Code中的Tailwind CSS IntelliSense插件使用技巧
《咸鱼之王》新版孙坚技能解析
哔哩哔哩的|直播|间怎么送礼物_哔哩哔哩|直播|送礼操作指南
智云Q3和Q2有什么升级_智云Q3与Q2手持云台功能与性能对比分析
《火影忍者:木叶高手》快速升级攻略
Python高效统计字典嵌套列表值在目标列表中的出现次数
Win10截图远程协助 Win10远程桌面截屏法【场景应用】
firefox火狐浏览器最新官网主页_ firefox火狐浏览器平台入口直达官方链接
win11讲述人怎么关闭 Win11屏幕朗读辅助功能禁用方法【技巧】
《新三国志曹操传》游历事件袁尚突围攻略
支付宝如何解绑云闪付_支付宝与云闪付账户关联解除方法
Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型
抖音商城官网是什么_抖音商城官方网址与访问方法
《星露谷物语》克林特好感度事件介绍
在VS Code中利用AI辅助进行代码迁移
视频转蓝光m2ts格式
一点万象签到领积分指南
PDF文件去水印平台入口 PDF水印删除网址
QQ网页版入口导航 QQ网页版在线访问通道
家里的小飞虫总是不断,用什么方法可以彻底根除?
实现可重用自定义Python Range类
CSS绝对定位与溢出控制:实现背景元素局部显示不触发滚动条
厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项
Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程
苹果SE如何开启单手模式_苹果SE单手操作功能
知乎APP怎么查看自己被邀请的问题_知乎APP邀请回答记录查看与参与方法
在Django单元测试中优雅处理信号:基于环境的条件执行策略
深入理解J*aScript异步操作:setTimeout与调用栈的真相
天堂漫画网页版在线阅读 天堂漫画手机版入口
批改网官网首页登录 批改网学生用户登录入口
《tt语音》超级玩家开通方法
AO3永久镜像入口开放_AO3最新网址兼容所有浏览器
掌握Go App Engine项目结构与GOPATH:包管理与导入实践
学习通网页版课程打不开_课程无法访问时的解决方法
c++如何实现观察者设计模式_c++行为型设计模式实战
漫蛙manwa官网浏览入口_漫蛙漫画网页版访问链接
2020-09-01
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。