⾼级sql优化notexists
left join 替换 not exists
⾼级sql 优化
SQL优化案例–使⽤LEFT JOIN替换NOT EXISTS⼦查询
sql优化的几种方式Ferrari1001简书作者0.1682018-06-12 09:30打开App在⼀些业务场景中,会使⽤NOT EXISTS语句确保返回数据不存在于特定集合,部分同事会发现NOT EXISTS有些场景性能较差,甚⾄有些⽹上谣⾔说”NOT EXISTS不⾛索引”,哪对于NOT EXISTS语句,我们如何优化呢?##以今天优化的SQL为例,
优化前SQL为:SELECT count(1)FROM t_monitor mWHERE NOT exists(SELECT 1FROM t_alarm_realtime AS aWHERE
我们使⽤LEFT JOIN⽅式进⾏优化,优化后SQL为:SELECT count(1)FROM t_monitor mLEFT JOIN t_alarm_realtime AS aON
优化效果:优化前执⾏时间29秒以上,优化后1.2秒,优化提升25倍##
哪NOT EXISTS真的不⾛索引么?查看两种SQL的执⾏计划:使⽤NOT EXIST⽅式的执⾏计划:a.png使⽤LEFT JOIN⽅式的执⾏计划:b.png从执⾏计划来看,两个表都使⽤了索引,区别在于NOT EXISTS使⽤“DEPENDENT SUBQUERY”⽅式,⽽LEFT JOIN使⽤普通表关联的⽅式。========================================================##通过MySQL提供的Profiling⽅式来查看两种⽅式的执⾏过程使⽤NOT EXIST⽅式的执⾏过程c.png使⽤LEFT JOIN⽅式的执⾏过程:d.png从执⾏过程来看,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μs578436=28921800us=28.92s。从上⾯执⾏过程可以推断出:使⽤NOT EXISTS⽅式的执⾏性
能严重依赖于NOT EXISTS⼦查询的执⾏次数即外层查询结果集的数据量。1、 当外层查询结果集的数据量N较⼩时执⾏性能较好,如有N=10执⾏时间为50μs10=500us=0.005s,再加上⼀些额外消耗,执⾏结果也能在0.01秒或10毫秒内范围,这个响应时间应该能被⼤部分应⽤程序接受。2、 当外层程勋结果集的数据量N较⼤甚⾄上千万数据量时,NOT EXISTS的查询性能会变得⾮常糟糕,甚⾄会⼤量消耗服务器IO和CPU资源从⽽影响其他业务正常运⾏。除上述问题外,在优化过程中发现本应该存储相同数据的resource_id列在两个表中定义不同,⼀表为VARCHAR⽽另外⼀表为BIGINT,外部结果集的字段类型和NOT EXIST字表中字段类型不同导致NOT EXISTS⼦查询中⽆法使⽤索引,使得⼦查询性能较差,最终影响整个查询的执⾏性能。© 著作权归作者所有,转载或内容合作请联系作者点赞赚钻最⾼⽇赚数百赞 (1)Ferrari1001您的赞赏就是对我最⼤的⿎励!赞赏暂⽆评论 写评论智慧如你,不想 发表⼀点想法 咩~推荐阅读 更多精彩内容 下载简书App 你也可以写⽂章赚赞赏 8种最坑的SQL错误⽤法,第⼀个就很坑?沛帆很奈斯 App中阅读 4838229觉得⾃⼰对Mysql事务很熟悉?那可能是你没碰到阿⾥⾯试官Java程序猿呀 App中阅读 3192331实战:上亿数据如何秒查码农⼩光 App中阅读 3926240⼀直认为count(1) ⽐ count(*) 效果⾼,被同事鄙视了。码农⼩光 App中阅读 2529010深⼊了解MVCC数据库并发控制e0e180156aa8 App中阅读 149407《MySQL技术内幕:SQL编程》书摘沉默剑⼠ App中阅读 148703mysql ⼦查询我是强强 App中阅读 161604drbd指南不排版 App中阅读 256105善良⽆需考证cathySH App中阅读 6500⼤理·古城区橘⼦姑娘很漂亮 App中阅读 3100【情感账户】存款要⽤⼼,取款要谨慎国锐⽶粒 App中阅读 133301(⼆)UI Automator测试项⽬的建⽴撒哈拉沙漠的向往 App中阅读 7300异星爱强国lee App中阅读 6701打开App,看更多相似好⽂
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论