mysql查询语句in和exists二者的区别和性能影响

mysql查询语句in和exists二者的区别和性能影响,第1张

in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。

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

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

例如:表A(小表),表B(大表)

1:

select * from A where cc in (select cc from B) 效率低,用到了A表上cc列的索引

select * from A where exists(select cc from B where cc=A.cc) 效率高,用到了B表上cc列的索引。

相反的

2:

select * from B where cc in (select cc from A) 效率高,用到了B表上cc列的索引;

select * from B where exists(select cc from A where cc=B.cc) 效率低,用到了A表上cc列的索引。

not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

in 与 =的区别

select name from student where name in ('zhang','wang','li','zhao')

select name from student where name='zhang' or name='li' or name='wang' or name='zhao'

的结果是相同的。

在查询效率上,是第一个快

但是在对服务器的io压力上,倾向于使用第二个

因为一次查询就是一次mysql链接,占一个磁盘io。而且mysql一般的链接数是2000.你这一循环就一下占100个链接,虽然不会那么夸张,但是如果是高并发的情况。。就不容乐观了。

所以推荐使用第二个。

SELECT b.id FROM t_address a, t_unit b WHERE b.utj=1 AND b.ufreeze=2 AND a.id=b.uads and a.sid=3

就这个啦!!

原因很简单

b.utj=1不满足的话,那么系统就直接找下一个数据

用的in的话,如果第一个不满足,那么就匹配第二个,第二个不满足,在匹配第三个

,全部不匹配 才找下一条数据!!

这个就可以看到了,可能用IN的话,效率可能会减慢3倍,打个比方


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6197550.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-17
下一篇 2023-03-17

发表评论

登录后才能评论

评论列表(0条)

保存