1.in和exists
  in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。    

  exists()后面的子查询被称做相关子查询,它和in查询不同,in()后面的子查询 是返回结果集的;而exists是不返回列表的值的,只是返回一个ture或false,也就是说exists判断子查询的结果是不是存在,但并不关心查到的是什么结果,是什么字段(这也是为什么子查询里经常会有"select 1"或select数字的原因);

  其实我们区分in和exists,还有一种理解就是通过驱动顺序,如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了;

exists执行顺序:

  • 首先执行一下外部查询;
  • 对于外部查询的每一行分别执行一次子查询,返回一个逻辑值true或者false;
  • 根据子查询返回的逻辑结果来确定主查询的结果集;

  如果两个表中一个是小表,一个是大表,则子查询表大的用exists,子查询表小的用in效率高点:
例如:表A(小表),表B(大表)

(1). select * from A where cc in (select cc from B)
-- 效率低,用到了A表上cc列的索引;
(2). select * from A where exists(select cc from B where cc=A.cc)
-- 效率高,用到了B表上cc列的索引。 -- 相反的
(3). select * from B where cc in (select cc from A)
-- 效率高,用到了B表上cc列的索引;
(4). select * from B where exists(select cc from A where cc=B.cc)
-- 效率低,用到了A表上cc列的索引。

2. not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not exists 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

3. 如果查询的两个表大小相当,那么用in和exists差别不大。

4. 总结:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况

参考:http://bbs.csdn.net/topics/310148714

http://bbs.csdn.net/topics/350022037?list=lz

最新文章

  1. 创建第一个 vlan network "vlan100" - 每天5分钟玩转 OpenStack(94)
  2. TCP/IP 协议难点之一—— IP分片
  3. C#知识点总结【1】
  4. Kafka 之 async producer (1)
  5. PERCONA-TOOLKIT 工具文档
  6. SCALA常规练习B
  7. jQuery插件实现select下拉框左右选择_交换内容(multiselect2side)
  8. How do I create an IIS application and application pool using InnoSetup script
  9. js判断浏览器在PC中打开还是移动设备中打开
  10. 学习计划——巩固基础+进阶练习
  11. rsync 自动创建目录的坑点
  12. 记一次需要用到复杂的groupingBy的需求
  13. Anaconda下载及安装及查看安装的Python库用法
  14. ORM框架(ITDOS实战源码)
  15. learning ddr reset initialization with stable power
  16. golang-build-error
  17. benthos v1 的一些新功能
  18. RNA Sequencing
  19. 冲刺博客NO.2
  20. ArrayList源码解读(jdk1.8)

热门文章

  1. [BZOJ4553][HEOI2016]序列 CDQ分治
  2. 【刷题】BZOJ 2599 [IOI2011]Race
  3. 【BZOJ1063】【NOI2008】道路设计(动态规划)
  4. CF825F String Compression 解题报告
  5. 谷哥的小弟学前端(02)——HTML常用标签(2)
  6. 删除docker网络docker0
  7. u3d摄像机截图
  8. TersorflowTutorial_MNIST数据集上简单CNN实现
  9. 理解PV操作和信号量
  10. JS-DOM-随时更新