新来的同事问我 where 1=1 是什么意思。。还有谁不会?

简介: 新来的同事问我 where 1=1 是什么意思。。还有谁不会?

写在前面

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

今天来说明下。


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 可以很方便的解决我们条件为空的问题,那么这么写 有什么问题吗 ?


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


实测

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


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

image.png

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

image.png

对比上面两种我们会发现 可以看到 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标签 代替。

相关文章
|
安全 小程序 程序员
删库跑路大神「后悔」了?我只不过犯了大家都会犯的编程错误!(2)
删库跑路大神「后悔」了?我只不过犯了大家都会犯的编程错误!
111 0
删库跑路大神「后悔」了?我只不过犯了大家都会犯的编程错误!(2)
|
Apache 云计算 开发者
删库跑路大神「后悔」了?我只不过犯了大家都会犯的编程错误!(1)
删库跑路大神「后悔」了?我只不过犯了大家都会犯的编程错误!
166 0
删库跑路大神「后悔」了?我只不过犯了大家都会犯的编程错误!(1)
写了个全局变量的bug,被同事们啪啪打脸
前阵子写了一个功能,测试 0 bug 就上线了,上线后也运行好好的,好多天都没有人反馈bug,超爽。。 不出问题还好,出问题就是大问题。。
|
SQL JavaScript Java
新来的同事问我 where 1=1 是什么意思
新来的同事问我 where 1=1 是什么意思
新来的同事问我 where 1=1 是什么意思
|
芯片
程序人生 - 手上总有静电该怎么处理?
程序人生 - 手上总有静电该怎么处理?
153 0
程序人生 - 手上总有静电该怎么处理?
|
人工智能 安全 数据挖掘
这么一搞,再也不怕线程打架了
假如我们需要处理一个文本文件,里面有 100万行数据,需要对每条数据做处理,比如将每行数据的数字做一个运算,放入到另一个文件里。
151 0
这么一搞,再也不怕线程打架了
|
消息中间件 调度 容器
为什么校招面试中“线程与进程的区别”老是被问到?我该如何回答?
为什么校招面试中“线程与进程的区别”老是被问到?我该如何回答?
178 0
为什么校招面试中“线程与进程的区别”老是被问到?我该如何回答?
万万没想到,线程居然被饿死了!
万万没想到,线程居然被饿死了!
|
前端开发 程序员 Linux
10年程序员怒斥:只会八股文没用,公司招你来是做项目的,不是背题的……
前段时间跟一个老同事去出项目,我请他喝咖啡。闲聊之间得知他已经在这行干了十年并且在北京成家买房,我肃然起敬,啪!的一下就站起来了。同事摆摆手示意我坐下说话,收手的时候顺带摸了两下稀疏的头发,满是自豪。
514 0