千家信息网

分析MySQL钟not exists与索引的关系

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍分析MySQL钟not exists与索引的关系,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在一些业务场景中,会使用NOT EXISTS语句确保返回数据不存在
千家信息网最后更新 2026年10月31日分析MySQL钟not exists与索引的关系

这篇文章主要介绍分析MySQL钟not exists与索引的关系,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

在一些业务场景中,会使用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子查询的执行次数即外层查询结果集的数据量。

  1. 当外层查询结果集的数据量N较小时执行性能较好,如有N=10执行时间为50μs*10=500us=0.005s,再加上一些额外消耗,执行结果也能在0.01秒或10毫秒内范围,这个响应时间应该能被大部分应用程序接受。

  2. 当外层程勋结果集的数据量N较大甚至上千万数据量时,NOT EXISTS的查询性能会变得非常糟糕,甚至会大量消耗服务器IO和CPU资源从而影响其他业务正常运行。

除上述问题外,在优化过程中发现本应该存储相同数据的resource_id列在两个表中定义不同,一表为VARCHAR而另外一表为BIGINT,外部结果集的字段类型和NOT EXIST字表中字段类型不同导致NOT EXISTS子查询中无法使用索引,使得子查询性能较差,最终影响整个查询的执行性能。

京东商城也曾出现过大量类似案例,一些表使用VARCHAR来存放订单号,而另一些表使用BIGINT来存放,在两表进行管理时性能极差,希望研发同事引以为戒。关注公众号Java技术栈回复m36获取一份MySQL研发军规。

以上是分析MySQL钟not exists与索引的关系的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

方式 查询 索引 性能 数据 过程 结果 消耗 时间 外层 组合 分析 不同 较差 业务 两个 内容 同事 场景 字段 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中智农互联网科技 齐家互联网科技有限公司 西藏七维空间互联网科技有限公司 创业天下互联网科技有限公司 南山科技园互联网公司有哪些 受益于互联网科技的高速发展 厦门比较好的科技互联网公司 福建科技产业互联网发展 互联网科技公司实习生 语蝶互联网科技有限公司 广州市恰铎互联网科技有限公司 合肥互联网科技公司公章图片 美国互联网科技公司 广州燕处互联网科技有限公司 济南小医互联网科技有限公司招聘 抖集互联网科技技术咨询 广州梦谷互联网科技有限公司领导 互联网金融运营模式中的金融科技 华人运通互联网科技公司 山东亿川互联网科技有限责任公司 为想互联网科技 智慧科技互联网 时间互联网络科技 苏州大垚互联网科技 甘肃拓世互联网科技有限公司 科技互联网大厂 互联网科技和法律行业 互联网公司高科技产品 杭州披云加互联网科技有限公司 北京天晋互联网科技有限公司
0