MySQL中exists与in的使用 对比
来源:互联网 发布:苹果4s如何变成4g网络 编辑:程序博客网 时间:2024/06/06 03:22
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录,反之如果exists里的条 件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件,当能返回结果集则为true,不能返回结果集则为 false
mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。
如果查询的两个表数据量相当,那么用in和exists差别不大
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 正相反