新来的同事问我 where 1=1 是什么意思

简介: 新来的同事问我 where 1=1 是什么意思
  • 写在前面
  • where 1=1
  • 实测
  • 结论

写在前面

新的同事来之后问我 where 1=1 是什么有意思,这样没意义啊,我笑了。今天来说明下。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。

项目地址:https://github.com/YunaiV/ruoyi-vue-pro

where 1=1

先来看一段代码

<select id="queryBookInfo" parameterType="com.ths.platform.entity.BookInfo" resultType="java.lang.Integer">
 select count(id) from t_book t where 1=1
<if test="title !=null and title !='' ">
 AND title = #{title} 
</if> 
<if test="author !=null and author !='' ">
 AND author = #{author}
</if> 
</select>

上面的代码很熟悉,就是查询符合条件的总条数。在mybatis中常用到if标签判断where子句后的条件,为防止首字段为空导致sql报错。没错 ,当遇到多个查询条件,使用where 1=1 可以很方便的解决我们条件为空的问题,那么这么写 有什么问题吗 ?

网上有很多人说,这样会引发性能问题,可能会让索引失效 ,那么我们今天来实测一下,会不会不走索引?

基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。

项目地址:https://github.com/YunaiV/onemall

实测

title字段 已经加上索引,我们通过EXPLAIN看下

EXPLAIN SELECT * FROM t_book WHERE  title = '且在人间';

8.jpg

EXPLAIN SELECT * FROM t_book WHERE 1=1 AND title = '且在人间';

11.jpg

对比上面两种我们会发现 可以看到 possible_keys(可能使用的索引)  和  key(实际使用的索引)都使用到了索引进行检索

结论

where 1=1也会走索引,不影响查询效率,我们写的sql指令会被mysql 进行解析优化成自己的处理指令,在这个过程中1 = 1这类无意义的条件将会被优化。

使用explain EXTENDED  sql 进行校对,发现确实where1=1这类条件会被mysql的优化器所优化掉。

那么我们在mybatis当中可以改变一下写法,因为毕竟mysql优化器也是需要时间的,虽然是走了索引,但是当数据量很大时,还是会有影响的,所以我们建议代码这样写:

<select id="queryBookInfo" parameterType="com.ths.platform.entity.BookInfo" resultType="java.lang.Integer">
 select count(*) from t_book t
<where>
<if test="title !=null and title !='' ">
 title = #{title} 
</if>
<if test="author !=null and author !='' "> 
 AND author = #{author}
</if>
</where> 
</select>

我们用 where标签 代替。

相关文章
|
9月前
|
机器学习/深度学习 数据挖掘 新能源
2023年我都干了啥?
中国人都喜欢过春节,2024年农历新年来临之际,又到了回首过去展望未来的时候。在2023年年初的时候就立了flag,要练好架子鼓、实现英语阅读的自由、写技术博客,换车等,一年过去了进度怎么样呢?2023年我都干了啥?
74 0
|
存储 设计模式 缓存
新来了个同事,代码命名规范是真优雅呀!代码如诗!!
新来了个同事,代码命名规范是真优雅呀!代码如诗!!
|
设计模式 XML 缓存
新来了个同事,代码命名规范是真优雅呀!代码如诗!! 下
新来了个同事,代码命名规范是真优雅呀!代码如诗!! 下
|
存储 缓存 监控
新来了个同事,代码命名规范是真优雅呀!代码如诗!! 上
新来了个同事,代码命名规范是真优雅呀!代码如诗!! 上
|
存储 JavaScript 算法
新来个大厂同事,数据库设计的居然这么漂亮,佩服!
新来个大厂同事,数据库设计的居然这么漂亮,佩服!
|
SQL 消息中间件 前端开发
103. 面试技巧:面试的时候我只会聊项目,结果就把我挂了
103. 面试技巧:面试的时候我只会聊项目,结果就把我挂了
150 0
103. 面试技巧:面试的时候我只会聊项目,结果就把我挂了
|
消息中间件 存储 前端开发
面试官让我手写队列,差点没写出来,回来后赶忙把重点记下来
栈和队列是一对好兄弟,前面我们介绍过一篇栈的文章(栈,不就后进先出),栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出入口,只能后进先出(在外面的先出去,堵在里面先进去的就有点倒霉)。而队列就好比是一个隧道,后面的人跟着前面走,前面人先出去(先入先出)。日常的排队就是队列运转形式的一个描述!
126 0
面试官让我手写队列,差点没写出来,回来后赶忙把重点记下来
|
SQL 关系型数据库 MySQL
新来的同事问我 where 1=1 是什么意思。。还有谁不会?
新来的同事问我 where 1=1 是什么意思。。还有谁不会?
162 0
新来的同事问我 where 1=1 是什么意思。。还有谁不会?
|
人工智能 安全 数据挖掘
这么一搞,再也不怕线程打架了
假如我们需要处理一个文本文件,里面有 100万行数据,需要对每条数据做处理,比如将每行数据的数字做一个运算,放入到另一个文件里。
155 0
这么一搞,再也不怕线程打架了
|
数据库
2020年6月9号,我们准备干一件大事
2020年6月9日。阿里云峰会来了!
949 0