好的,所以我有一个查询:
select distinct(a) from mytable where b in (0,3)
以上将会更快,或者
select distinct(a) from mytable where b = 0 or b = 3
有一般规则吗?
谢谢
双方IN并OR会做一个查询b = 0,接着一个b = 3,然后做一个合并连接的两个结果集,最后筛选出任何重复。
IN
OR
b = 0
b = 3
使用IN,重复项并没有真正的意义,因为b不能同时使用0和3,但是事实是IN将重复转换为b = 0 OR b = 3和OR,重复项_是_ 有意义的,因为您可以使用b = 0 OR a = 3,并且如果您要将两个分开结果集,对于与两个条件均匹配的每条记录,最终可能会出现重复项。
b
0
3
b = 0 OR b = 3
b = 0 OR a = 3
因此,无论您使用IN还是,都将始终执行重复过滤OR。但是,如果您从一开始就知道没有重复项(通常是在使用时的情况),IN则可以使用UNIONALL不过滤重复项的方法来获得一些性能:
UNIONALL
select distinct(a) from mytable where b = 0 UNION ALL select distinct(a) from mytable where b = 3