IN与EXISTS优化
用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优化相关推荐
- Oracle执行exists优化,PHP_解决Oracle性能优化中的问题, 在Oracle性能优化时,用exists - phpStudy...
在Oracle性能优化时,用exists替代in,用表链接替代exists,关于前者,一般效果比较明显,exists效率明显比in高,但是如果要想表连接的效率比exists高,必须在from子句中,将 ...
- mysql not exists优化_MySQL优化--NOT EXISTS和LEFT JOIN方式差异
在MySQL中,我们可以将NOT EXISTS语句转换为LEFT JOIN语句来进行优化,哪为什么会有性能提升呢? 使用NOT EXISTS方式SQL为: SELECT count(1)FROMt_m ...
- MySQL——in和exists优化
文章目录 前言 in的使用和优化 exists的使用和优化 前言 前面几篇博客重点讲述了索引树的结构,以及索引分主键索引(聚簇索引).普通索引和聚合索引等. 以及也讲述了排序.分页等优化措施. 本篇博 ...
- oracle is null效率,Oracle查询优化之is null和is not null优化
最近工作的时候遇到了比较大的数据查询,自己的sql在数据量小的时候没问题,在数据量达到300W的时候特别慢,只有自己优化sql了,以前没有优化过,所以记录下来自己的优化过程,本次是关于is null和 ...
- 无法从套接字读取更多的数据 oracle_小伙面试时被追问数据库优化,面试前如何埋点反杀?
前言 周五的早高峰, 各地软件园地铁站里中出现了不少穿着长袖加绒格子衫, 背双肩电脑包的年轻码农, 现在节气正值 [ 小雪 ] , 11月的全国性突然降温 , 让经历过996摧残的猿们一出地铁站就冻的 ...
- SQL 优化方案(实用版)
一.SQL语句及索引的优化 SQL语句的优化 尽量避免使用子查询 用IN来替换OR 读取适当的记录LIMIT M,N,而不要读多余的记录 禁止不必要的Order By排序 总和查询可以禁止排重用uni ...
- MySql数据结构、索引优化原则(Java劝退师)
MySql(InnoDB)随手记 MySql索引为甚么选择的是B+.几种数据结构相比,二叉树.红黑树无法保证树的高度可控.当在内存中操作的时候,这些数据结构由于树深度造成的影响可能还能接受, 但作为数 ...
- MySQL - 语句优化
目录 1.In和Exists优化 2.not in 优化, 3.limit 分页优化 Case1: 根据主键字段排序的分页查询 Case2:根据非主键字段排序的分页查询 4.join 关联查询优化 关 ...
- 老司机总结的12条 SQL 优化方案(非常实用)
今日推荐 减少 try-catch ,这样做才叫优雅!让人上瘾的新一代开发神器,彻底告别Controller.Service.Dao等方法SpringBoot实现人脸识别功能相信我,使用 Stream ...
最新文章
- 【C/C++多线程编程之九】pthread读写锁
- Qt QWidget实现消息提示控件TipsWidget
- dockerq启动报错(iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9876 -j DNAT --t
- 600W个微信红包封面,人人都能领取到!!!
- Python分析5000+抖音大V,发现大家都喜欢这类视频
- while用法_when 和 while 的用法区别
- 忽略证书_中专考生注意!忽略这一点,四科全过也拿不到执业药师证书!
- linux service和daemon
- 2020年互联网大厂中秋礼盒PK!看看你的礼盒怎么样
- Linux安全加固手册
- UTF-8字符集中文排序方法研究
- 老电脑可以升级win10系统吗
- openwrt路由器挂载sdcard为overlay
- Win10如何用微软账户自动登录电脑
- 使用函数节流思想避免 SAP UI5 应用里按钮短时间内被高频重复点击试读版
- PostgreSQL数据库动态共享内存管理器——dynamic shared memory segment
- 关于HTTP重定向至HTTPS
- 计算机保研面试基础知识,华科计算机保研复试机试题目
- 【网络技术】(5)身份认证技术与访问控制------数字签名技术
- [元带你学NVMe] 设备自测试操作(NVMe Device Self-test Operations) 详解与实战
热门文章
- Java Colections 集合类 —— List、ArrayList、Set(HashSet)
- 古谚、评论与论断、名篇与名言
- 人,作为社会的基础单元
- 电学 —— LC 振荡电路
- linux 命令行域名的解析(DNS) —— dig、host
- Matlab Tricks(三)—— subplot 的组织
- 深度学习基础(十)—— 稀疏编码(二)
- python varchar_在python中声明varchar
- 箱线图怎么看_K线的48种不同类型全解(建议收藏),教你怎么看懂K线图
- python是什么类型的编程语言-Python是一种什么样的编程语言?解释?编译?汇编?机械?...