用Left join代替not in
Posted 临界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Left join代替not in相关的知识,希望对你有一定的参考价值。
很多人都知道 在各种数据库里面 not in 的效率极其低下.例如
select * from a
where a.id not in (
select id from b
)
我们假如a表有 10万条记录,
而b表里面也有10万条记录,
那么需要的判断是 10万 乘以 10万 ,则是100亿次判断.所以执行效率极其低下.
即使发现存在就返回.那么也有 100亿/2=50亿次判断.
此时,我们可以用 Left join 来进行判断则快很多
select a.* from a
left join b
on a.id=b.id
where b.id is null
我相信这句语句大家都看的懂,相对来说.这里只要进行10万数据连接,然后进行10万次判断就可以了.总共只有20万次.
而10万数据连接来说,速度是很快的.
100亿/20万 相差 5万倍速度.
50亿/20万 相差 2.5万倍速度.
对于这个来说,假如a 表的数据越多,则提成的越快.
当然我这个上面涉及的是 a,b表里面都没有重复的ID,假如涉及到重复的ID.则可以通过 except 等字进行过滤.从而提高连接速度.
而在 distinct 和 left join 之间的效率就需要你的经验来判断了
以上是关于用Left join代替not in的主要内容,如果未能解决你的问题,请参考以下文章
Oracle,用left join 替代 exists ,not exists,in , not in,提高效率
为什么 EXISTS(NOT EXIST) 与 JOIN(LEFT JOIN) 的性能会比 IN(NOT IN) 好
查询优化 Not in to Left outer join