mysql替换notin_MySQL代替innotin的sql语句
1.in和exists
in是把外表和内表作hash连接,⽽exists是对外表作loop循环,每次loop循环再对内表进⾏查询,⼀直以来认为exists⽐in效率⾼的说法是不准确的。
如果查询的两个表⼤⼩相当,那么⽤in和exists差别不⼤;如果两个表中⼀个较⼩⼀个较⼤,则⼦查询表⼤的⽤exists,⼦查询表⼩的⽤in。
⼀般情况下,主表中的数据要少,从表的数据要多。
例:table a(⼩表) 、table b(⼤表)
select * from a where id in(select in from b) -->效率低,⽤到了a表上id列的索引;
select * from a where exists(select id from b where id=a.id) -->效率⾼,⽤到了b表上id列的索引。
与之相反:
select * from b where id in(select id from a) -->效率⾼,⽤到了b表上id列的索引
sql语句替换表中内容select * from b where exists(select id from a where id=b.id) -->效率低,⽤到了a表上id列的索引。
(1)性能的考虑此时就按⼦表⼤主表⼩⽤exist,⼦表⼩主表⼤⽤in的原则就可以.
(2)写法的不同, exist的where条件是: "...... where exist (..... where a.id=b.id)"
in的where条件是: " ...... where id in ( select )"
< in和not exists
在做查询时,想要查询有联系的两张表,想得到结果是⼀张表有⽽另外⼀张表没有的数据时,我们通常会⽤not in:
select * from a where a.id not in (select id from b)
通常,我们会习惯性的使⽤not in,在数据⽐较少的时候是可以的,但是⼀旦数据量⼤了,not in的效率就会显得差了点。
因为not in 和not exists如果查询语句使⽤了not in 那么内外表都进⾏全表扫描,没有⽤到索引;⽽not extsts 的⼦查询依然能⽤到表上的索引。
所以⽆论那个表⼤,⽤not exists都⽐not in要快。
所以推荐使⽤not exists或者外连接来代替:
select * from a where not exists(select id from b where id=a.id)
或者
select * from a left join b on a.id = b.id where b.id is null;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论