在一些业务场景中,会使用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 a.resource_id=m.resource_idAND a.resource_type=m.resource_typeAND a.monitor_name=m.monitor_name)
我们使用LEFT JOIN方式进行优化,优化后SQL为:
SELECT count(1)FROM t_monitor mLEFT JOIN t_alarm_realtime AS aON a.resource_id=m.resource_idAND a.resource_type=m.resource_typeAND a.monitor_name=m.monitor_nameWHERE a.resource_id is NULL
优化效果:
优化前执行时间29秒以上,优化后1.2秒,优化提升25倍
那NOT EXISTS真的不走索引么?
查看两种SQL的执行计划:
使用NOT EXIST方式的执行计划