SQL语句中的IN和NOT IN子查询理解起来很直观,和实际的业务也很匹配,所以经常会被开发人员使用,如果是数据量不大的表还好,如果数据量较大的话就会出现性能问题。所以就需要对not in 语句进行优化。
例如现在有一条sql:
SELECT count(*) FROM yong_hu_sheng_qing q WHERE q.isdelete=0 AND q.id not in ( (SELECT sq_id FROM process_control WHERE succeed_time is null AND is_delect=0 GROUP BY sq_id))
该条sql的查询时间
大概3秒左右了,这在实际开发中是不能容忍的。查阅文档发现还可以用NOT Exists ,于是修改成NOT Exists再尝试一下。
修改成 NOT Exists后,发现提升的效率几乎可有可无。这个时候咱们可以选择使用 左连接,例如:
SELECT count(*) FROM yong_hu_sheng_qing q left JOIN ((SELECT sq_id FROM process_control WHERE succeed_time is null AND is_delect=0 GROUP BY sq_id)) a ON q.id=a.sq_id WHERE q.isdelete=0 AND a.sq_id is null
可以看出 效率大大的 提高了。以后碰到用not in, NOT Exists满足不了的小伙伴,可以尝试写这种方法。