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

2024-03-01 0 644
目录
  • 前言
  • 聊聊mybatis中多条件拼接的两种常规写法
    • where 1=1
    • 使用<where>标签
  • 性能影响
    • where 1=1
    • <where> 标签
  • 总结

    前言

    • 最近在项目中使用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性能影响的资料请关注悠久资源网其它相关文章!

    收藏 (0) 打赏

    感谢您的支持,我会继续努力的!

    打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
    点赞 (0)

    悠久资源 Mysql 深入探究MySQL中使用where 1=1是否存在性能影响 https://www.u-9.cn/database/mysql/175914.html

    常见问题

    相关文章

    发表评论
    暂无评论
    官方客服团队

    为您解决烦忧 - 24小时在线 专业服务