深入探究MySQL中使用where 1=1是否存在性能影响
更新时间:2024年02月20日 11:00:21 作者:Lorin洛林
最近在项目中使用 mybatis 写 SQL 使用了 where 1=1 来简化多条件拼接的写法,案例如下,借此聊聊多条件拼接的常见的一些写法以及 where 1=1 是否存在性能影响,需要的朋友可以参考下
前言
- 最近在项目中使用
mybatis 写 SQL 使用了 where 1=1来简化多条件拼接的写法,案例如下,借此聊聊多条件拼接的常见的一些写法以及where 1=1是否存在性能影响。
<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
- 如前言中的示例:
<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元素会将它们去除。
<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 版本:
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 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部分已经被查询优化器优化掉,所有对整体的性能影响并不大。
# 性能对比 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>标签是多条件拼接的两种常见写法,性能层面而言并没有较大的影响,具体选择何种写法可以根据团队的规范决定。- 此外两种方案的处理与处理的数据量无关,一次执行都仅处理一次,所以在大数据量下也无性能差异。
以上就是深入探究MySQL中使用where 1=1是否存在性能影响的详细内容,更多关于MySQL where 1=1性能影响的资料请关注脚本之家其它相关文章!
相关文章
Java的Struts框架中append标签与generator标签的使用
这篇文章主要介绍了Java的Struts框架中append标签与generator标签的使用方法,Struts是Java的SSH三大web开发框架之一,需要的朋友可以参考下2015-12-12
MySQL 5.6.51 解压版(zip版)安装配置图文方法
这两天刚试用了一下MySQL5.6.51,感觉还不错,有兄弟戏称是一个高富帅版本。现将MySQL5.6.51 zip解压版本的安装配置过程记录如下,希望能给需要安装该版本的朋友一点参考作用2015-08-08
Windows下实现MySQL自动备份的批处理(复制目录或mysqldump备份)
Windows下实现MySQL自动备份的批处理,新建目录并复制压缩,结合windows计划任务方便实现每天的自动备份2012-05-05
MySQL插入数据insert ignore语法重复数据自动忽略
这篇文章主要给大家介绍了关于MySQL插入数据insert ignore语法重复数据自动忽略的相关资料,最近工作中使用到了insert ignore into语法,感觉这个语法还是挺有用的,就记录下来做个总结,需要的朋友可以参考下2023-08-08


最新评论