irpas技术客

MySQL关键字OR/IN/NOT IN/EXISTS/NOT EXISTS的区别_拐锅_mysql or关键字

网络投稿 6968

IN 和 OR 的区别:

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

如果in和or所在列没有 索引的话,性能差别就很大了。在没有索引的情况下,随着in或者or后面的数据量越多,in的效率不会有太大的下降,但是or会随着记录越多的话性能下降 非常厉害。

因此在给in和or的效率下定义的时候,应该再加上一个条件,就是所在的列是否有索引或者是否是主键。如果有索引或者主键性能没啥差别,如果没有索引,性能差别不是一点点!

IN 和 EXISTS 的区别:

EXISTS代表存在量词?。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或者逻辑假值“false”。

IN是把外表和内表作hash连接; 而EXISTS是对外表进行便利,每次取外表的一条记录去结合内层查询(子查询)结果,若内层查询结果为非空,则外层的WHERE子句返回值为真,否则返回值为假。

如果查询的两个表大小相当,那么用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列的索引

考虑性能的话,就按子表大主表小用EXISTS,子表小主表大用IN的原则就可以

写法的不同, EXISTS的where条件是: “… where EXISTS (… where a.id=b.id)” IN的where条件是:" … where id IN ( select id … where a.id=b.id)"

NOT IN 和NOT EXISTS的区别

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

一个简单例子,有两张表。一张用户表,一张订单表(包含有用户ID),需要查询没有下过订单的用户。

采用NOT EXISTS和NOT IN分别查出未下过订单的用户

NOT IN 查询SQL语句如下:

SELECT * from ttt_user u WHERE u.user_id not in (SELECT user_id from ttt_order o WHERE o.user_id = u.user_id)

NOT IN 查询执行计划如下:

NOT EXISTS 查询SQL语句如下:

SELECT * from ttt_user u WHERE not EXISTS (SELECT user_id from ttt_order o WHERE o.user_id = u.user_id)

NOT EXISTS 查询执行计划如下:

同时也贴一下IN 和EXISTS的查询计划:

IN 查询执行计划如下:

EXISTS 查询执行计划如下:


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #MySQL #or关键字 #in # #or #如果in和or所在列没有 #索引的话性能差别就很大了