xiaopan-cp9

原文地址

1 select * from A where id in(select id from B)
2 
3 select a.* from A a where exists(select 1 from B b where a.id=b.id)

先说结论:in 适合B表比A表数据小的情况  ,  exists 适合B表比A表数据大的情况   ;  A表和B表 数据量大致一样时,效率相差无几

in

先对子查询进行查询,然后与主查询结果做笛卡尔积,然后按照条件筛选,所以子查询数据量比较少的时候,会大大减少笛卡尔积的大小。

exists

子查询只是个检测行是否存在的条件,返回 true 则加入结果集,false 就不加入结果集。

先查询主查询的结果,然后按照结果循环去判断每条数据是否满足子查询条件,满足则存留结果,否则从结果集中去除

not in 和 not exists

如果查询使用了not in 那么内外表都进行全表扫描,没有用到索引;

而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

分类:

技术点:

相关文章:

  • 2021-11-28
  • 2021-08-29
  • 2021-10-28
  • 2021-11-05
  • 2021-09-14
猜你喜欢
  • 2021-10-14
  • 2021-08-03
  • 2021-08-03
  • 2021-08-03
  • 2021-10-04
  • 2021-08-03
  • 2021-11-05
相关资源
相似解决方案