用inner join,不要用in或者exists

当B表的数据集必须小于A表的数据集时,用in优于exists,
当A表的数据集系小于B表的数据集时,用exists优于in

优化原则:小表驱动大表,即小的数据集驱动大的数据集。

############# 原理 (RBO) #####################

-- A表 > B表:in select * from A where id in (select id from B) -- 等价于: for select id from B for select * from A where A.id = B.id 

当B表的数据集小于A表的数据集时,用in优于exists。

-- A表 < B表:exists select * from A where exists (select 1 from B where B.id = A.id) -- 等价于 for select * from A for select * from B where B.id = A.id 

当A表的数据集小于B表的数据集时,用exists优于in。

注意:A表与B表的ID字段应建立索引。

例如:

 /** 执行时间:0.313s **/ SELECT SQL_NO_CACHE * FROM rocky_member m WHERE EXISTS ( SELECT 1 FROM rocky_vip_appro a WHERE m.ID = a.user_id AND a.passed = 1 ); /** 执行时间:0.160s **/ SELECT SQL_NO_CACHE * FROM rocky_member m WHERE m.ID in( SELECT ID FROM rocky_vip_appro WHERE passed = 1 ); 

not in 和 not exists 用法类似。

全文:
in和exists
in 是把外表和内表作hash连接,而 exists 是对外表作loop循环,每次loop循环再对内表进行查询。

一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。

如果两个表中一个较小,一个是大表,则子查询表大的用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列的索引。

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

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

in 与 =的区别

select name from student where name in ('zhang','wang','li','zhao');` 与 select name from student where name='zhang' or name='li' or name='wang' or name='zhao' 

结果是相同的。

IN与EXISTS优化相关推荐

  1. Oracle执行exists优化,PHP_解决Oracle性能优化中的问题, 在Oracle性能优化时,用exists - phpStudy...

    在Oracle性能优化时,用exists替代in,用表链接替代exists,关于前者,一般效果比较明显,exists效率明显比in高,但是如果要想表连接的效率比exists高,必须在from子句中,将 ...

  2. mysql not exists优化_MySQL优化--NOT EXISTS和LEFT JOIN方式差异

    在MySQL中,我们可以将NOT EXISTS语句转换为LEFT JOIN语句来进行优化,哪为什么会有性能提升呢? 使用NOT EXISTS方式SQL为: SELECT count(1)FROMt_m ...

  3. MySQL——in和exists优化

    文章目录 前言 in的使用和优化 exists的使用和优化 前言 前面几篇博客重点讲述了索引树的结构,以及索引分主键索引(聚簇索引).普通索引和聚合索引等. 以及也讲述了排序.分页等优化措施. 本篇博 ...

  4. oracle is null效率,Oracle查询优化之is null和is not null优化

    最近工作的时候遇到了比较大的数据查询,自己的sql在数据量小的时候没问题,在数据量达到300W的时候特别慢,只有自己优化sql了,以前没有优化过,所以记录下来自己的优化过程,本次是关于is null和 ...

  5. 无法从套接字读取更多的数据 oracle_小伙面试时被追问数据库优化,面试前如何埋点反杀?

    前言 周五的早高峰, 各地软件园地铁站里中出现了不少穿着长袖加绒格子衫, 背双肩电脑包的年轻码农, 现在节气正值 [ 小雪 ] , 11月的全国性突然降温 , 让经历过996摧残的猿们一出地铁站就冻的 ...

  6. SQL 优化方案(实用版)

    一.SQL语句及索引的优化 SQL语句的优化 尽量避免使用子查询 用IN来替换OR 读取适当的记录LIMIT M,N,而不要读多余的记录 禁止不必要的Order By排序 总和查询可以禁止排重用uni ...

  7. MySql数据结构、索引优化原则(Java劝退师)

    MySql(InnoDB)随手记 MySql索引为甚么选择的是B+.几种数据结构相比,二叉树.红黑树无法保证树的高度可控.当在内存中操作的时候,这些数据结构由于树深度造成的影响可能还能接受, 但作为数 ...

  8. MySQL - 语句优化

    目录 1.In和Exists优化 2.not in 优化, 3.limit 分页优化 Case1: 根据主键字段排序的分页查询 Case2:根据非主键字段排序的分页查询 4.join 关联查询优化 关 ...

  9. 老司机总结的12条 SQL 优化方案(非常实用)

    今日推荐 减少 try-catch ,这样做才叫优雅!让人上瘾的新一代开发神器,彻底告别Controller.Service.Dao等方法SpringBoot实现人脸识别功能相信我,使用 Stream ...

最新文章

  1. 【C/C++多线程编程之九】pthread读写锁
  2. Qt QWidget实现消息提示控件TipsWidget
  3. dockerq启动报错(iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9876 -j DNAT --t
  4. 600W个微信红包封面,人人都能领取到!!!
  5. Python分析5000+抖音大V,发现大家都喜欢这类视频
  6. while用法_when 和 while 的用法区别
  7. 忽略证书_中专考生注意!忽略这一点,四科全过也拿不到执业药师证书!
  8. linux service和daemon
  9. 2020年互联网大厂中秋礼盒PK!看看你的礼盒怎么样
  10. Linux安全加固手册
  11. UTF-8字符集中文排序方法研究
  12. 老电脑可以升级win10系统吗
  13. openwrt路由器挂载sdcard为overlay
  14. Win10如何用微软账户自动登录电脑
  15. 使用函数节流思想避免 SAP UI5 应用里按钮短时间内被高频重复点击试读版
  16. PostgreSQL数据库动态共享内存管理器——dynamic shared memory segment
  17. 关于HTTP重定向至HTTPS
  18. 计算机保研面试基础知识,华科计算机保研复试机试题目
  19. 【网络技术】(5)身份认证技术与访问控制------数字签名技术
  20. [元带你学NVMe] 设备自测试操作(NVMe Device Self-test Operations) 详解与实战

热门文章

  1. Java Colections 集合类 —— List、ArrayList、Set(HashSet)
  2. 古谚、评论与论断、名篇与名言
  3. 人,作为社会的基础单元
  4. 电学 —— LC 振荡电路
  5. linux 命令行域名的解析(DNS) —— dig、host
  6. Matlab Tricks(三)—— subplot 的组织
  7. 深度学习基础(十)—— 稀疏编码(二)
  8. python varchar_在python中声明varchar
  9. 箱线图怎么看_K线的48种不同类型全解(建议收藏),教你怎么看懂K线图
  10. python是什么类型的编程语言-Python是一种什么样的编程语言?解释?编译?汇编?机械?...