关于in与exists的效率讨论
关于in与exists的效率讨论
1)、select * from A where id in (select id from B)
以上查询使用了in语句,in只执行一次,他查出B表的所有id字段并缓存起来。之后,
检查A表的id是否与B表中的id相等,如果相等,则将A表的记录加入结果集中,直到遍历完A表的所有记录。
由此可知,当B表数据较大时,不适合使用in,因为它会将B表数据全部遍历一次。
如:A表有1000条记录,B表有10000000条记录,那么最多有可能遍历1000*10000000次,效率差。
如:A表有1000条记录,B表有100条记录,那么最多有可能遍历1000*100次,遍历次数大大减少,效率大大提升。
结论:in适合B表A表数据小的情况。
2)、select a.* from A a where exists(select 1 from B b where a.id = b.id)
以上查询使用了exists语句,exists会执行A.length次,它并不缓存exists结果集,因为结果集的内容并不重要,重要的
是结果集中是否有记录,如果有则返回true,没有则返回false。
由此可知,B表比A表数据大时,适合使用exists,因为它没有那么多的遍历操作,只需要再执行一次查询就行。
如:A表有10000条记录,B表有1000000条记录,那么exists会执行10000次去判断A表中的id是否与B表中的id相等。
如:A表有10000条记录,B表有100000000条记录,那么exists会执行1000此,因为它只执行A.length次,
可见B表数据越多,越适合exists发挥效果。
如:A表有10000条记录,B表有100条记录,那么exists还是执行10000次,还不如使用in遍历10000*100次,因为in是在内存里
遍历比较,而exists需要查询数据库,大家都知道查询数据库所消耗的性能更高,而内存比较块。
结论:exists适合B表比A表数据大的情况。
当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用。
备注:可能有点小争议,若有独到的见解,大家可以交流一下。
没有绝对的正确,只有相对的正确。
关于in与exists的效率讨论的更多相关文章
- SQLSERVER语句 in和exists哪个效率高本人测试证明
SQLSERVR语句 in和exists哪个效率高本人测试证明 最近很多人讨论in和exists哪个效率高,今天就自己测试一下 我使用的是客户的数据库GPOSDB(已经有数据) 环境:SQLSERVE ...
- in和exists哪个效率高本人测试证明
in和exists哪个效率高本人测试证明 SQLSERVR语句 in和exists哪个效率高自己测试本人测试证明 最近很多人讨论in和exists哪个效率高,今天就自己测试一下 我使用的是客户的数据库 ...
- 关于sql中in 和 exists 的效率问题,in真的效率低吗
原文: http://www.cnblogs.com/AdamLee/p/5054674.html 在网上看到很多关于sql中使用in效率低的问题,于是自己做了测试来验证是否是众人说的那样. 群众: ...
- 关于sql中in 和 exists 的效率问题
在用in的地方可以使用freemark标签代替,例如: 将 <#if assistantList??&& (assistantList?size > 0)> AND ...
- MySQL IN和EXISTS的效率问题,以及执行优化
网上可以查到很多这样的说法: 如果查询的两个表大小相当,那么用in和exists差别不大.如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: 例如:表A(小表),表B ...
- IN和EXISTS、not in 和not exists的效率详解
从效率来看: 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<& ...
- mysql中or和in,in和exists的效率问题
mysql中or和in的效率问题 在网上一直看到的是or和in的效率没啥区别,一直也感觉是这样,前几天刚好在看<mysql数据库开发的36条军规>的文章,里面提到了or和in的 ...
- sql中 in , not in , exists , not exists效率分析
in和exists执行时,in是先执行子查询中的查询,然后再执行主查询.而exists查询它是先执行主查询,即外层表的查询,然后再执行子查询. exists 和 in 在执行时效率单从执行时间来说差不 ...
- oracle中的exists 和not exists 用法 in与exists语句的效率问题
博文来源(oracle中的exists 和not exists 用法):http://chenshuai365-163-com.iteye.com/blog/1003247 博文来源( in与exi ...
随机推荐
- js中隐式类型转换测试
javascript数据类型: 使用typeof可以返回的数据类型有六种 "number" , "string" , "boolean" ...
- Global::pickClassMethod_DNT
/*************************************************** Created Date: 19 Jul 2013 Created By: Jimmy Xie ...
- 开发流程习惯的养成—TFS简单使用
才开始用,所以是个很基础的介绍,欢迎大家一起交流学习 一.追本溯源 讲到开发流程,还要从敏捷开始,因为敏捷才有了开发流程的重视,整个流程也是按照敏捷的思想进行的,这里不再叙述敏捷的定义 敏捷的流程(个 ...
- 通过替换frm文件方式修改表结构
版本:5.6.16 在自己的虚拟环境中,测试创建一个表,表结构如下:mysql> drop table yoon_temp;Query OK, 0 rows affected (0.09 sec ...
- IOS开发之──应用之间调用(1)
iphone应用之间调用步骤: 1)在plist文件中,注册对外接口 在xcode group&files 里面,展开 resources选择<app>info.plist 鼠标右 ...
- mac os快捷键
选中一个词,使用control+command+d,可以启用词典 option+command+d,隐藏/显示 doc command + k terminal 清除历史记录 control + up ...
- macos port总结
http://stackoverflow.com/questions/733951/unable-to-download-the-source-code-of-open-source-projects ...
- Extmail maildrop错误
错误: <liuyb@5teacher.com>: Command died with status 127: "maildrop". Command output: ...
- android 开发高仿QQ表情选择、输入框
首先大家看效果: 用到的文件有(源码文件有,只包含表情.输入框等有关文件,工程项目是公司项目,恕不公开啦): res: drawable/face_del_icon.xml drawable/iv_f ...
- android退出登陆后,清空之前所有的activity,进入登陆主界面
如题: android退出登陆后,清空之前所有的activity,进入登陆主界面 在退出登陆时只需要增加一个intent标志 Intent intent_login = new Intent(); i ...