where的使用
朋友问我为啥要用where 1=1 作为查询条件
问题发起
今天朋友问我,为啥需要用到where 1=1作为查询条件,有啥意义,想必可能有
些朋友也有类似的疑问,我跟有问题的朋友一起过一下
where 1=1
大家先看段代码
<select id="selectKey" parameterType="java.util.Map" resultType="">
select ID,CUSTOMER_CODE
from CUSTOMER_AUTHENTICATION
where 1=1
<if test="appId !=null and appId !=''">
and APP_ID=#{appId}
</if>
<if test="appKey !=null and appKey !=''">
and APP_KEY=#{appKey}
</if>
</select>
会不会影响sql效率呢
实测
观点1:使用了“1=1”这样的过滤条件后数据库就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描以比较此行是否满足过滤条件,当表中的数据量非常大的时候效率会显得非常慢
sql如下:
EXPLAIN select * from company_white_list where 1=1 and company_name ='深圳市英诺美达科技有限公司';
结果如下:
EXPLAIN select * from company_white_list where company_name ='深圳市英诺美达科技有限公司';
结果如下:
经过我们实测,where 1= 1是走了索引的
结论
where 1=1 也会走索引,不影响查询效率,我们写的sql指令会被mysql 进行解析优化成自己的处理指令,在这个过程中1 = 1这类无意义的条件将会被优化。使用explain EXTENDED sql 进行校对,发现确实where1=1这类条件会被mysql的优化器所优化掉。
那么我们在mybatis当中可以改变一下写法,因为毕竟mysql优化器也是需要时间的,虽然是走了索引,但是当数据量很大时,还是会有影响的,所以我们建议代码这样写
<select id="selectKey" parameterType="java.util.Map" resultType="">
select ID,CUSTOMER_CODE
from CUSTOMER_AUTHENTICATION
<where>
<if test="appId !=null and appId !=''">
and APP_ID=#{appId}
</if>
<if test="appKey !=null and appKey !=''">
and APP_KEY=#{appKey}
</if>
</where>
</select>
留个关注
《日常分享系列》,会持续更新,想了解的朋友可以关注 ,文章有帮助的话可以长按点赞有惊喜!!!文章比较长,大家可以先 收藏、转发后再看,有什么补充可以在下面评论,谢谢大家!