会员登录 | 注册会员 | 学习交流 | 会员中心 | 在线充值 | QQ在线咨询
扫一扫添加微信咨询
咨询电话:199-4385-7008
在线客服:
本站主要提供AICS6、PSCS6、CDRX6、DWCS6、html、CSS样式、js脚本、ASP、PHP等视频教程,近期隆重推出平面设计、网页设计视频教程套装,在线学习结合视频光盘/U盘,是您成为设计大师的必经之路!
您所在的位置:首页 >> 学习交流 >> 数据库管理 >> MYSQL数据库
收藏本版 订阅
查看: 5511 | 回复: 0
redwe
[普通会员]

Mysql中 inorexists not exists not in区别

发表于 2017-07-01 09:56:39 | 只看该作者 |倒序浏览 |阅读模式

Mysql中 in or exists not exists not in区别

in 和or区别:

如果in和or所在列有索引或者主键的话,or和in没啥差别,执行计划和执行时间都几乎一样。

如果in和or所在列没有 索引的话,性能差别就很大了。在没有索引的情况下,随着in或者or后面的数据量越多,in的效率不会有太大的下降,但是or会随着记录越多的话性能下降 非常厉害  因此在给in和or的效率下定义的时候,应该再加上一个条件,就是所在的列是否有索引或者是否是主键。如果有索引或者主键性能没啥差别,如果没有索引,性能差别不是一点点!

in和exists

in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;

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

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列的索引。

相反的:

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列的索引。

1.性能的考虑此时就按子表大主表小用exist,子表小主表大用in的原则就可以.

2.写法的不同, exist的where条件是:      "......  where exist (..... where a.id=b.id)"
--in的where条件是: " ...... where  id in ( select id .... where a.id=b.id)" 
not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。
所以无论那个表大,用not exists都比not in要快。
  • 点评 回复 编辑 支持 反对
  • 使用道具 评分 举报 管理

客服热线(8:00-23:00)

133 4385 7008

在线QQ客服:3316841367 张老师
微信账号:laozhangsoft123

微信公众号