SQL语句中的NOT IN 的优化

SQL语句中的IN和NOT IN子查询理解起来很直观,和实际的业务也很匹配,所有经常被开发人员使用,数据量不大的表还好,如果数据量太大将导致性能问题。

原SQL:
SELECT COUNT(DISTINCT T.ID)
  FROM TASK T
 WHERE T.TENANT_KEY= 'TP18SQUME1'
   AND T.ID IN(
SELECT ENTITY_ID
  FROM SHARE_ENTRY
 WHERE ENTRY_TYPE= 'user'
   AND SID= 8005824118306255410)
   AND T.ID NOT IN(
SELECT DISTINCT S.TARGET_ID
  FROM STREAM S
 WHERE S.OPT_USER= 8005824118306255410
   AND S.TARGET_ID IS NOT NULL)
   AND T.CREATOR!= 8005824118306255410
   AND T.STATUS= 'todo'

由于IN和NOT IN会全表扫描,所有以上查询性能很低,耗时4s左右;

优化后的SQL:
SELECT COUNT(DISTINCT T.ID) FROM ((select ID from TASK  WHERE TENANT_KEY= 'TP18SQUME1' AND CREATOR!= 8005824118306255410 AND STATUS= 'todo') T 
left join (SELECT TARGET_ID FROM STREAM WHERE OPT_USER= 8005824118306255410) S ON T.ID = S.TARGET_ID
left join (SELECT ENTITY_ID FROM SHARE_ENTRY WHERE ENTRY_TYPE= 'user' AND SID= 8005824118306255410) E ON T.ID=E.ENTITY_ID) 
WHERE S.TARGET_ID IS NULL AND E.ENTITY_ID IS NOT NULL


用join链接查询代替IN和NOT IN查询可以大大提高效率,优化后的查询耗时0.2s。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值