MySQL中exists与in的使用 对比

EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。

exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录,反之如果exists里的条 件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件,当能返回结果集则为true,不能返回结果集则为 false

mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。

如果查询的两个表数据量相当,那么用in和exists差别不大


如果两个表中一个数据量较小,一个是表 数据量大,则子查询表数据量大的用exists,子查询表数据量小的用in: 
例如:表waybill_tab (数据量大),表group_members_tab (数据量小)

SELECT * from waybill_tab w where groupid in (SELECT groupid from group_members_tab where userid = 19); 效率高,用到了waybill_tab 表上groupid 列的索引;

SELECT * from waybill_tab w where EXISTS (SELECT 1 from group_members_tab g where g.groupid = w.groupid and g.userid = 19)效率低,用到了group_members_tab 表上groupid列的索引;

in查询相当于多个or条件的叠加,比如下面的查询

select * from waybill_tab where groupid in (1, 2, 3);

等效于

select * from waybill_tab where groupid = 1 or groupid = 2 or groupid = 3;

NOT EXISTS 的作用与 EXISTS 正相反

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值