IT俱乐部 MySql 深入探究MySQL中使用where 1=1是否存在性能影响

深入探究MySQL中使用where 1=1是否存在性能影响

前言

  • 最近在项目中使用 mybatis 写 SQL 使用了 where 1=1 来简化多条件拼接的写法,案例如下,借此聊聊多条件拼接的常见的一些写法以及 where 1=1 是否存在性能影响。
	SELECT * FROM users 
	WHERE 1=1
		
			AND user_name = #{userName}
		
			AND user_age = #{userAge }
		
			AND	user_sex = #{userSex}
		

聊聊 mybatis 中多条件拼接的两种常规写法

where 1=1

  • 如前言中的示例:
	SELECT * FROM users 
	WHERE 1=1
		
			AND user_name = #{userName}
		
			AND user_age = #{userAge }
		
			AND	user_sex = #{userSex}
		

使用  标签

  • mybatis 提供  标签, 标签只有在一个以上的if条件有值的情况下才去插入WHERE子句。若AND 或 OR 前没有有效语句,where 元素会将它们去除。
	SELECT * FROM users 
	
			AND user_name = #{userName}
		
			AND user_age = #{userAge }
		
			AND	user_sex = #{userSex}
		

性能影响

  • where 1=1 和  标签两种写法前者性能损耗在 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 1=1 在 MySQL 中服务器层由查询优化器进行处理, 标签在动态构建 SQL 中处理,但性能也无很大影响,因为本质并不是很复杂的动态 SQL 生成。

总结

  • where 1=1 标签是多条件拼接的两种常见写法,性能层面而言并没有较大的影响,具体选择何种写法可以根据团队的规范决定。
  • 此外两种方案的处理与处理的数据量无关,一次执行都仅处理一次,所以在大数据量下也无性能差异。

以上就是深入探究MySQL中使用where 1=1是否存在性能影响的详细内容,更多关于MySQL where 1=1性能影响的资料请关注IT俱乐部其它相关文章!

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/database/mysql/9823.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部