新的同事来之后问我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 = '且在人间';

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

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

作者:苏世

链接:juejin.cn/post/7030076565673213989

mysql----where 1=1是什么意思相关推荐

  1. mysql 快捷查询数据库各表占用空间,mysql查看索引占用空间,mysql查看数据占用空间

    先贴一张图! 第一步,"很重要" 在mysql中,有一个创建之初自带的库information_schema,这个库中包含着数据库相关信息,查询数据占用空间就是使用该库,所以首先进 ...

  2. mysql并发更新数据,多用户并发修改数据解决方案。

    mysql并发更新数据,多用户并发修改数据解决方案. 在系统中,有一些如余额.资产.积分的数据,是要保证数据一致性的.如,一个人使用两个设备同时进行消费操作,如何保证数据一致性的问题. 我们一起来思考 ...

  3. mysql查询字段大小写结果相同,mysql大小写查询不敏感,mysql5.7查询不区分大小写解决方案。

    下面有两条sql,主键查询,在mysql中查询到的结果相同. SELECT* FROM USER WHEREid = 'EM58hdK4nXC';SELECT* FROM USER WHEREid = ...

  4. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  5. mybatis查询报错:com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string

    mybatis查询报错: com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from strin ...

  6. docker一步安装mysql,docker的魅力就在于此

    正常来说,使用docker安装东西的步骤是serach它有没有,然后pull它 这里其实只要一步(如果你没有安装过.没有端口占用等问题的话!!) $ docker run -d -p 3306:330 ...

  7. 设置腾讯云linux服务器中 MySQL 允许远程访问

    申请了一台linux腾讯云服务器,想要把数据库搭建在上面,本地的Windows直接可以访问 以下就是具体的操作流程,首先你需要安装好一个mysql,安装方法–>mysql安装(Linux) 接着 ...

  8. Linux安装mysql,一步到位!

    今天在腾讯云上面买了一个服务器,想要把自己的项目部署一下,就要安装mysql,以下是我的安装步骤,在网上有很多人把install敲错了,还有的少-get,种种错误试完之后,我决定发一篇 sudo ap ...

  9. Mysql函数group_concat、find_in_set 多值分隔字符字段进行数据库字段值翻译

    Mysql函数group_concat.find_in_set进行数据库字段值翻译 场景 配方表:记录包含的原料 sources表示原料,字段值之间用逗号分隔 原料表:对应原料id和原料名称 现需要查 ...

  10. 浅谈MySQL存储引擎-InnoDBMyISAM

    浅谈MySQL存储引擎-InnoDB&MyISAM 存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式 ...

最新文章

  1. Redis双机热备方案--转
  2. wampserver运行后报错问题
  3. 9月21日云栖精选夜读 | 如何优雅地从四个方面加深对深度学习的理解
  4. 尴尬君正,是如何被“创新”带到沟里去的?
  5. Spring容器初始化实现V2 版本
  6. 为什么lamda不能修改外部引用的变量?
  7. [C++基础]032_常用的字符串处理函数(strcat,strcpy,strcmp,strupr,strlwr,strlen)...
  8. ajax 返回flase,Django request.is_ajax返回false
  9. poj3176 基础的动态规划算法 挑战程序设计竞赛
  10. Android系统中震动功能的测试
  11. HTTP 错误 403.1 - 禁止访问:执行访问被拒绝
  12. JAVA聊天室简易版1.0(多线程)
  13. 性能优化:缓存使用的秘密
  14. 在腾讯实习的那段日子:不要在难受的时候选择 '逃避/离开'
  15. 笔记本电脑装机详细步骤图文教程
  16. Drools规则引擎实践直白总结,Java开发教程入门
  17. 苹果数据线不能充电_去掉耳机和充电器,以后数据线苹果也不会送了
  18. 创业过程中技术真的那么重要吗
  19. 设置表格列宽 —— 在富文本编辑器中的实现
  20. 商场三十六计——第22计 “关门捉贼”

热门文章

  1. ZBrush - 冰雪奇缘角色建模
  2. 研发效能度量指标及其如何度量
  3. py 网站实时监控+可手动回溯回放网站数据的实现
  4. 委托朋友理财有风险吗
  5. 英语知识系列:按发音规律重排的英语音标
  6. (J3455/J3155/J4015/J4105/……)无线网卡M.2(ngff) keyA/E接口扩展sata硬盘接口,黑群辉NAS系统
  7. Java视频教程(浙江大学翁恺)
  8. 游戏开发入门——Lua(1)
  9. 实验三 XSS和SQL注入
  10. nvme分区选mbr还是guid_怎么分辨硬盘是GUID格式还是MBR格式以及怎样更改