转:https://blog.csdn.net/qq_27409289/article/details/85963089

1、IN查询分析

select * from a  where a.id in( select a_id from b )

相当于:

Object[] out={select *  from a};

Object[] in={select *  from a};

List<Object> result=new ArrayList();

for(int i =0;  i<>out.size();i++)

                 {

                     for (int j = 0 ; j<in.size(),j++){

                         if(out[i].id=in[j]){

                               result.add(out[i]));

                            }
}
}

在内存中进行比对,最大的比对数可以达到外层结果集*内层结果集

2、EXISTS查询分析

select * from a where exist(select 1  from b.a_id=a.id);

相当于:

Object[] out={select *  from a};

        List<Object> result=new ArrayList();

       for(int i=0;i<out.size();i++){

              //子查询(内查询)

               //1 去查询数据库

               // 2 判断外部数据的值执行第一步是是否能查到数据,返回 ture或者false 

              // 3 如果第二部为true

              if(exiset(out[i].id)){//执行  select * fron b where b.a_id=a.id;  会执行 out.size();次

                   result.add(out[i]));

               } 

       }

所以如果a表中的数据越大那么 子查询查询的次数就会越多,这样对效率就很慢

      例如:

        1 表a中100000条数据,表b中100条数据,查询数据库次数=1(表a查一次)+100000(子查询:查询表b的次数)  ,一共100001次

         2 表a中 100条数据,表b100000条,查询数据库次数=1(表a查一次)+100(子查询次数),一共 101次

         也就是说exits的查询次数=1+外层结果集的数量,可见只有当子查询的表数量远远大于外部表数据的用exist查询效率好

3.小结

  如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。

  其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标

最新文章

  1. Java中获取长度length和size的问题
  2. 【洛谷P1378】油滴扩展
  3. JQuery学习(选择器-可见性-hidden)
  4. BestCoder Round #60 1002
  5. 20160720-java高并发
  6. 现代程序设计 homework-07
  7. 最新app源码下载:200款优秀Android项目源码
  8. 【原】Storm及特点
  9. python 下的数据结构与算法---8:哈希一下【dict与set的实现】
  10. nginx配置方法
  11. Storm 分配逻辑
  12. MATLAB仿真中连续和离散的控制器有何区别?
  13. JavaScript中的私有成员[翻译]
  14. Springboot整合druid
  15. blfs(systemd版本)学习笔记-构建ibus-libpinyin使用中文输入法
  16. BZOJ1965 [Ahoi2005]SHUFFLE 洗牌 快速幂
  17. MSP MCU I2C入门指南
  18. 一、java概述
  19. Android笔记之 网络http通信
  20. 解决Vue循环中子组件不实时更新的问题

热门文章

  1. Vue2学习笔记
  2. 2022-11-05 Acwing每日一题
  3. Go语言核心36讲12
  4. C++ 动态规划:一维动态规划,背包问题,区间动态规划
  5. AIR32F103(六) ADC,I2S,DMA和ADPCM实现录音播放功能
  6. 基于.NetCore开发博客项目 StarBlog - (20) 图片显示优化
  7. 解决win7连接蓝牙耳机播放设备找不到的问题
  8. CAP 7.0 版本发布通告 - 支持延迟消息,性能炸了?
  9. 在实际应用中联合体union的妙用
  10. 【每日一题】2021年12月6日-剑指 Offer 22. 链表中倒数第k个节点