mysql15 sql优化-小表驱动大表 IN和EXITS
2024-09-08 01:34:43
转: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,那么先执行子查询,所以我们会以驱动表的快速返回为目标
最新文章
- Java中获取长度length和size的问题
- 【洛谷P1378】油滴扩展
- JQuery学习(选择器-可见性-hidden)
- BestCoder Round #60 1002
- 20160720-java高并发
- 现代程序设计 homework-07
- 最新app源码下载:200款优秀Android项目源码
- 【原】Storm及特点
- python 下的数据结构与算法---8:哈希一下【dict与set的实现】
- nginx配置方法
- Storm 分配逻辑
- MATLAB仿真中连续和离散的控制器有何区别?
- JavaScript中的私有成员[翻译]
- Springboot整合druid
- blfs(systemd版本)学习笔记-构建ibus-libpinyin使用中文输入法
- BZOJ1965 [Ahoi2005]SHUFFLE 洗牌 快速幂
- MSP MCU I2C入门指南
- 一、java概述
- Android笔记之 网络http通信
- 解决Vue循环中子组件不实时更新的问题
热门文章
- Vue2学习笔记
- 2022-11-05 Acwing每日一题
- Go语言核心36讲12
- C++ 动态规划:一维动态规划,背包问题,区间动态规划
- AIR32F103(六) ADC,I2S,DMA和ADPCM实现录音播放功能
- 基于.NetCore开发博客项目 StarBlog - (20) 图片显示优化
- 解决win7连接蓝牙耳机播放设备找不到的问题
- CAP 7.0 版本发布通告 - 支持延迟消息,性能炸了?
- 在实际应用中联合体union的妙用
- 【每日一题】2021年12月6日-剑指 Offer 22. 链表中倒数第k个节点