技术日常系列——朋友问我为啥要用where 1=1 作为查询条件

本文探讨了在SQL查询中使用where1=1的原因,虽然看似多余,但实则是优化器能处理的无意义条件。通过实例对比,展示了即使with1=1也能走索引,但建议避免在Mybatis中直接使用,提倡明确的条件语句以提高大规模数据下的查询效率。
摘要由CSDN通过智能技术生成

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>

留个关注

《日常分享系列》,会持续更新,想了解的朋友可以关注 ,文章有帮助的话可以长按点赞有惊喜!!!文章比较长,大家可以先 收藏转发后再看有什么补充可以在下面评论,谢谢大家

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有鹿如溪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值