exists与inner join的效率问题

SQL---数据表--连接 站在巨人的肩膀上,以小白的视角学习! 阅读详情

    二者并没有严格的效率高低之分,甚至依赖于数据库中数据的组织方式。

    exists的效率依赖于匹配度, join的效率则比较稳定。比如,对 select * from tableA as ta where exists (select 1 from tableB as tb where  ta.id = tb.id); 每扫描ta一行,就会扫描tb,遇到匹配就返回true,没遇到匹配就会把tb一直扫描下去。

    举个极端, tb中每行的id都与ta中每行id相同
即 ta
id
1
1
1
1
1
,,,
tb
id
1
1
1
1
1
1
一扫就有返回,效率极高

反之
ta
id
1
1
1

1
1
1
1
...
tb
id
0
0
0
0
0
0
..
每扫ta一行,都要扫完tb,效率极差。


内连接效率则稳定。 在不很清楚实际数据分布情况下,最好用内连接。    .
[华 软 网]

exists、in、inner join的区别效率 in用于检查一个值是否包含在列表中。exists用于检查子查询返回行的存在性 在子查询中,exists提供的性能通常比in提供的性能要好 IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况 ==================== in exists in是把外表内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询... 阅读详情

相关推荐

innerjoin exists的执行效率区别

今天在实现业务时发现经常使用exists语句竟然执行效率低下根本不出结果,反而innerjoin可以瞬间得到结果。后来发现是因为exsits需要从40万的数据集中去匹配200条数据是非常消耗资源的。总结:首先要确定数据分布情况,高命中的情况下使用exists效率要比innerjoin的高,低命中率的情况下还是使用innerjoin效率高。如果在不清楚数据分布情况的情况下,直接用innerjoi...

weixin_34319111的博客 1733

一波骚操作,我把 SQL 执行效率提高了 10,000,000 倍

场景我用的数据库是mysql5.6,下面简单的介绍下场景课程表:数据100条学生表:数据70000条学生成绩表SC数据70w条查询目的:查找语文考100分的考生查询语句:select s.* from Student s where s.s_id in (select s_id from SC sc where sc.c_id = 0 and sc.score = 100 ) 执行时间:30248...

十指波课堂的博客 946

在sql语句多表连接中,in、existsjoin那个效率更高一点

EXISTS、INJOIN,都可以用来实现形如“查询A表中在(或不在)B表中的记录”的查询逻辑。 在查询的两个表大小相当的情况下,3种查询方式的执行时间通常是: EXISTS EXISTS 只有当表中字段允许NULL时,NOT IN的方式最慢: NOT EXISTS 但是如果两个表中一个较小,一个较大,则子查询表大的用exists,子查询表小的用in,因

danfly1010的专栏 1万+

EXISTS、INJOIN性能分析 (实用)

原文出处:https://blog.csdn.net/caomiao2006/article/details/52099450?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242 EXISTS、INJOIN,都可以用来实现形如“查询A表中在(或不在)B表中的记录”的查询逻辑。 在论坛上看到很多人对此有所误解(如关于in的疑惑、用外连接IsNull代替notin两帖),...

chelen_jak的专栏 4175

mysql exists 效率_Mysql之existsinner join效率问题(1)

使用两张大小差距比较大的表来进行测试前言:在使用laravel的过程中发现whereHas实现的方式是exists子查询,又听说exists尽量少使用,容易导致慢查询,于是就有了接下来两篇文章。两张表结构如下:app_userapp_feedback(user_id列建立索引)很明显app_user表要比app_feedback表要大--------------------------------...

weixin_35990581的博客 4313

关于Existsinner join 一点讨论

exists效率依赖于匹配度。 inner join效率比较稳定。 select * from ta a where exists(select 1 from tb where a.id=b.id) 每扫ta一行,都扫tb,遇到匹配即返回ture,对tb的扫描在ta当前行不再继续下去,如果一直没找到,就会扫完tb (索引,或表扫) 即是说,匹配度很低,效率就很差。 举个极端, tb中每行的...

iteye_12432的博客 1239

Existsinner join的改写经验分享

EXISTS 是一个用于判断子查询是否返回至少一行数据的逻辑运算符,只关心子查询是否有返回行,而不关心返回的具体数据。这里存在exists中,按照理论来讲,exists只做存在判断,性能会比inner join更快,在existsinner join的结果集对主查询没有影响,因此我们也可以转换成exists。这里的计划会把exists做成index join,当转换成内连接时,exists会隐性去重,(即distinct操作符),去重之后再关联,减少关联次数提升性能。公众号:小周的工作笔记。

zcn126的博客 66

exists取代内联基本例子

之前是exists理论但是今天写sql突然用到exists

tellmewhoisi的博客 225

oracle 解决sql in参数多、数据量大时查询效率问题

1、使用union把多个参数生成一张参数表 SELECT * FROM( SELECT '1' A FROM DUAL UNION SELECT '2' A FROM DUAL UNION SELECT '3' A FROM DUAL UNION SELECT '4' A FROM DUAL UNION SELECT '5' A FROM DUAL UNION SELECT '6' A FROM...

qq_39505553的博客 4817

exist优化 in mysql_MySQL IN/EXISTS优化问题

MySQL IN/EXISTS优化问题where条件in操作,当子查询的条件中有IN操作时效率低下,sql语句:SELECTa.idFROMA aINNER JOIN B b ON a.id = b.idWHERE条件AND a.id IN (SELECT c.id FROM C c LEFT JOIN D d ON c.id=d.id WHERE 条件)尝试EXISTS同样效率低下,sql语句...

weixin_39944375的博客 358

MySQL 查询 select * from table where id in 如何提高效率

例句:select * from a where id in (select id from b ); 对于这条sql语句它的执行计划其实并不是先查询出b表的所有id,然后再a表的id进行比较。 mysql会把in子查询转换成exists相关子查询,所以它实际等同于这条sql语句:select * from a where exists(select * from b where b

zoubf的专栏 2万+

MySQL-- SQL优化经过

MySQL-- SQL优化经过   背景:有一个SQL如下 SELECT ut.* FROM user_transaction ut WHERE tx_type IN (1, 4, 8) AND tx_status = 1 AND share_public = 1 AND user_id != 103 AND (peer_user_id IS NULL OR peer...

yjc0403的博客 163

mysql子查询关联优化_mysql关联子查询的一种优化方法分析

本文实例讲述了mysql关联子查询的一种优化方法。分享给大家供大家参考,具体如下:很多时候,在mysql上实现的子查询的性能较差,这听起来实在有点难过。特别有时候,用到in()子查询语句时,对于上了某种数量级的表来说,耗时多的难以估计。本人mysql知识所涉不深,只能慢慢摸透个中玄机了。假设有这样的一个exists查询语句:select * from table1where exists(sele...

weixin_28568819的博客 445

【SQL开发实战技巧】系列(五):从执行计划看IN、EXISTS INNER JOIN效率,我们要分场景不要死记网上结论

从执行计划角度分析IN、EXISTS INNER JOIN效率而不是死记网上结论、表的5种关联:INNER JOIN、LEFT JOIN、RIGHT JOIN FULL JOIN 解析【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。

赵延东的一亩三分地 9万+

IN、EXISTSLEFT JOIN,NOT IN、NOT EXISTSINNER JOIN在存在不存在的查询效率

<br />/*<br /> IN、EXISTSLEFT JOIN,NOT IN、NOT EXISTSINNER JOIN在存在不存在的查询效率<br /> */<br /> <br />IF OBJECT_ID('A') IS NOT NULL<br />   DROP TABLE A<br /> GO<br /><br /> CREATE TABLE A<br /> (<br /> ID INT<br /> )<br /> GO<br /><br /> IF OBJECT_ID

feegle的专栏 3893

善用Axapta当中的exists joininner join

前几天,在做系统优化的时候,居然发现代码当中存在while嵌套循环语句while select table 1{…while select table2以前并不太在意,但是既然要系统优化,就只怕没找到东西可以改的。突然忽发奇想,何不测试一下这样做的系统开销有多大呢?于是写了三个job,进行测试static void TestInnerJoinUsingWhile(Args _args){    .

Junevoful的Axapta专栏 2012

使用 EXISTS 代替 IN inner join

在使用Exists时,如果能正确使用,有时会提高查询速度: 1,使用Exists代替inner join 2,使用Exists代替 in 1,使用Exists代替inner join例子: 在一般写sql语句时通常会遇到如下语句: 两个表连接时,取一个表的数据,一般的写法通过关联查...

a572893208的博客 1143

exists in join 效率比较

通常情况下,3种查询方式的执行时间:EXISTS <= IN <= JOINNOT EXISTS <= NOT IN <= LEFT JOIN只有当表中字段允许NULL时,NOT IN的方式最慢:NOT EXISTS <= LEFT JOIN <= NOT IN 综上:IN的好处是逻辑直观简单(通常是独立子查询);缺点是只能判断单字段,并且当NOT ...

AFFDS1412的博客 1762
上一篇: memcpy()函数即将禁用
下一篇: 原来php的dirname不检测文件是否存在
barfoo
博客等级 码龄20年 11粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值