新来的同事问我 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标签 代替。

相关文章
|
NoSQL 数据可视化 JavaScript
搭建easy-mock数据模拟服务器
搭建easy-mock数据模拟服务器
搭建easy-mock数据模拟服务器
|
机器学习/深度学习 传感器 人工智能
AI与未来医疗:重塑健康管理新格局随着人工智能(AI)技术的飞速发展,医疗行业正迎来一场前所未有的变革。AI不仅在数据分析、诊断支持方面展现出巨大潜力,还在个性化治疗、远程医疗等多个领域实现了突破性进展。本文将探讨AI技术在医疗领域的具体应用及其对未来健康管理的影响。
人工智能(AI)正在彻底改变医疗行业的面貌。通过深度学习算法和大数据分析,AI能够迅速分析海量的医疗数据,提供精准的诊断和治疗建议。此外,AI在远程医疗、药物研发以及患者管理等方面也展现出了巨大的潜力。本文将详细探讨这些技术的应用实例,并展望其对健康管理的深远影响。
1110 28
|
缓存 安全 Java
面试中的难题:线程异步执行后如何共享数据?
本文通过一个面试故事,详细讲解了Java中线程内部开启异步操作后如何安全地共享数据。介绍了异步操作的基本概念及常见实现方式(如CompletableFuture、ExecutorService),并重点探讨了volatile关键字、CountDownLatch和CompletableFuture等工具在线程间数据共享中的应用,帮助读者理解线程安全和内存可见性问题。通过这些方法,可以有效解决多线程环境下的数据共享挑战,提升编程效率和代码健壮性。
398 6
|
人工智能 监控 数据可视化
绩效考核管理的动态调整与持续优化
本文探讨了绩效考核管理在现代企业管理中的重要性,从核心原则、流程设计、指标设定、沟通反馈及持续优化五个方面进行了详细阐述,并推荐了板栗看板作为提升绩效管理效率的工具。文章强调了公平公正、客观量化、战略导向、持续反馈和结果应用的原则,以及平衡计分卡、KPI、OKR和360度反馈等多种考核方法的应用。板栗看板以其强大的可视化、动态追踪、高效沟通和数据分析功能,助力企业实现高效的绩效管理。
|
安全 物联网 网络安全
物联网卡在新疆不能使用的原因
物联网卡不能在新疆使用的原因可能涉及多个方面,这通常与国家政策、网络安全、地区特殊性以及运营商的管理策略有关。以下是一些可能的解释:
|
缓存 Oracle Java
Java中间件(1)--分布式系统&中间件从入门到精通(五)
Java中间件(1)--分布式系统&中间件从入门到精通(五)
|
Web App开发 分布式计算 分布式数据库
使用CopyTable同步HBase数据
CopyTable是Hbase提供的一个数据同步工具,可以用于同步表的部分或全部数据。本文介绍如何使用CopyTable同步HBase数据。针对没有hadoop集群的用户,还介绍了单机运行CopyTable的配置和参数。
8850 0
|
编解码 安全 网络协议
Computer:Todesk(远程控制软件)的简介、安装、使用方法之详细攻略
导读:近些年,ToDesk在远程控制软件领域异军突起,作为国产软件,发展迅猛,的确有“两把刷子”。博主近一段时间,通过下载安装,测试了文件传输、远程打印、远程开机,尤其是远程控制帮助博主自己的粉丝解决了很多编程上的bug,用起来还算比较得心应手,基本无延迟,而且不卡顿,要的就是口碑。其实,国外外市场上远程控制软件也不少,有的想要免费,有的是想要速度快,有的主要考虑安全,小孩子才做选择,而我们全要,免费且不限速的,恐怕只有ToDesk了。
Computer:Todesk(远程控制软件)的简介、安装、使用方法之详细攻略
|
域名解析 弹性计算 网络协议
阿里云服务器搭建网站完整教程(宝塔面板+wordpress)
阿里云服务器搭建网站完整教程(宝塔面板+wordpress)阿里云轻量应用服务器怎么使用?阿里云轻量应用服务器使用教程:轻量应用服务器购买、重置密码、远程连接、宝塔面板的Web环境搭建、WordPress网站程序安装到网站上线,阿里云服务器网分享轻量应用服务器从购买、配置建站环境、轻量服务器应用服务器远程连接、开端口到网站上线全流程
1011 0
|
数据库
要注销域名,您可以按照以下步骤
要注销域名,您可以按照以下步骤
6904 2