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差别不大


如果两个表中一个数据量较小,一个是表数据量大,则子查询表数据量大的用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 正相反

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 蚌埠市代理项目排行榜 聊城市代理项目排行榜 广州市代理项目排行 深圳市国际货运代理有限公司 市级代理商 深圳市电子有限公司 深圳市燃气集团股份有限公司 无锡市同步电子科技有限公司 广州市医药公司 西安市轨道交通集团有限公司 烟台市喜旺食品有限公司 深圳市正易龙科技有限公司 广州市大阳摩托车有限公司 广州市医药有限公司流向 广州市保伦电子有限公司 武汉市水务集团有限公司 广州市建筑集团有限公司 北京市绿友食品有限公司 深圳市喜投金融服务有限公司 惠州市吉瑞科技有限公司 常州市华润复合材料有限公司 温州市东风运输有限公司 深圳市地铁集团有限公司 深圳市传音科技有限公司 武汉市天然气有限公司 农委 市净率 市净率低 市净率是什么 市盈率市净率 市净率市盈率 市净率计算公式 市净率意思 市净率公式 怎么计算市净率 创业板平均市净率 市净率多少好 市净率多少才合理 a股历史市净率 市净率的意义 市净率低股票