前言
- 最近在项目中使用
mybatis 写 SQL 使用了 where 1=1
来简化多条件拼接的写法,案例如下,借此聊聊多条件拼接的常见的一些写法以及where 1=1
是否存在性能影响。
sql
<select id="" parameterType = "">
SELECT * FROM users
WHERE 1=1
<if test="userName != null ">
AND user_name = #{userName}
</if>
<if test="userAge != null ">
AND user_age = #{userAge }
</if>
<if test="userSex!= null ">
AND user_sex = #{userSex}
</if>
</select>
聊聊 mybatis
中多条件拼接的两种常规写法
where 1=1
- 如前言中的示例:
sql
<select id="" parameterType = "">
SELECT * FROM users
WHERE 1=1
<if test="userName != null ">
AND user_name = #{userName}
</if>
<if test="userAge != null ">
AND user_age = #{userAge }
</if>
<if test="userSex!= null ">
AND user_sex = #{userSex}
</if>
</select>
使用 <where>
标签
mybatis
提供<where>
标签,<where>
标签只有在一个以上的if条件有值的情况下才去插入WHERE
子句。若AND 或 OR
前没有有效语句,where
元素会将它们去除。
sql
<select id="" parameterType = "">
SELECT * FROM users
<where>
<if test="userName != null ">
AND user_name = #{userName}
</if>
<if test="userAge != null ">
AND user_age = #{userAge }
</if>
<if test="userSex!= null ">
AND user_sex = #{userSex}
</if>
</where>
</select>
性能影响
where 1=1
和<where>
标签两种写法前者性能损耗在SQL查询性能优化
,后者在于SQL 语句动态生成
。下面我们来具体分析一下:- MySQL 版本:
sql
SELECT VERSION();
5.7.44
# 数据构造 SQL
CREATE TABLE IF NOT EXISTS t_user
(
id INT not null auto_increment primary key comment '自增ID',
name varchar(20) comment '姓名',
age tinyint comment '年龄'
)ENGINE = INNODB;
INSERT INTO t_user ( NAME, age ) VALUES ( '张三', 18 ),( '李四', 19 ),( '王五', 20 ),( '司总', 21 );
where 1=1
- 在 5.7 以上版本中,
SQL查询性能优化
会将1=1
部分优化掉,并不会影响索引,但网上有部分资料说在低版本中有一定影响,所以需要稍微留意一下。
sql
# 注:需要选中一起执行可以查看到优化后的 SQL
explain select * from t_user where 1=1 AND name = '张三';
show warnings;
# 优化后的 SQL
/* select#1 */ SELECT
`mydatabase`.`t_user`.`id` AS `id`,
`mydatabase`.`t_user`.`name` AS `name`,
`mydatabase`.`t_user`.`age` AS `age`
FROM
`mydatabase`.`t_user`
WHERE
(
`mydatabase`.`t_user`.`name` = '张三')
- 从优化后的
SQL
可以看到,1=1
部分已经被查询优化器优化掉,所有对整体的性能影响并不大。
sql
# 性能对比
select * from t_user where 1=1 AND name = '张三'
> OK
> 查询时间: 0.046s
select * from t_user where 1=1
> OK
> 查询时间: 0.046s
<where>
标签
- 相比于
where 1=1
在 MySQL 中服务器层由查询优化器进行处理,<where>
标签在动态构建SQL
中处理,但性能也无很大影响,因为本质并不是很复杂的动态SQL
生成。
总结
where 1=1
和<where>
标签是多条件拼接的两种常见写法,性能层面而言并没有较大的影响,具体选择何种写法可以根据团队的规范决定。- 此外两种方案的处理与处理的数据量无关,一次执行都仅处理一次,所以在大数据量下也无性能差异。
个人简介
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。
🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。
💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。
🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。
📖 保持关注我的博客,让我们共同追求技术卓越。