翼度科技»论坛 编程开发 mysql 查看内容

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

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
前言


  • 最近在项目中使用
    1. mybatis 写 SQL 使用了 where 1=1
    复制代码
    来简化多条件拼接的写法,案例如下,借此聊聊多条件拼接的常见的一些写法以及
    1. where 1=1
    复制代码
    是否存在性能影响。
  1. <select id="" parameterType = "">
  2.         SELECT * FROM users
  3.         WHERE 1=1
  4.                 <if test="userName != null ">
  5.                         AND user_name = #{userName}
  6.                 </if>
  7.                 <if test="userAge != null ">
  8.                         AND user_age = #{userAge }
  9.                 </if>
  10.                 <if test="userSex!= null ">
  11.                         AND        user_sex = #{userSex}
  12.                 </if>
  13. </select>
复制代码
聊聊 mybatis 中多条件拼接的两种常规写法



where 1=1


  • 如前言中的示例:
  1. <select id="" parameterType = "">
  2.         SELECT * FROM users
  3.         WHERE 1=1
  4.                 <if test="userName != null ">
  5.                         AND user_name = #{userName}
  6.                 </if>
  7.                 <if test="userAge != null ">
  8.                         AND user_age = #{userAge }
  9.                 </if>
  10.                 <if test="userSex!= null ">
  11.                         AND        user_sex = #{userSex}
  12.                 </if>
  13. </select>
复制代码
使用 <where> 标签


    1. mybatis
    复制代码
    提供
    1. <where>
    复制代码
    标签,
    1. <where>
    复制代码
    标签只有在一个以上的if条件有值的情况下才去插入
    1. WHERE
    复制代码
    子句。若
    1. AND 或 OR
    复制代码
    前没有有效语句,
    1. where
    复制代码
    元素会将它们去除。
  1. <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>
复制代码
性能影响


    1. where 1=1
    复制代码
    1. <where>
    复制代码
    标签两种写法前者性能损耗在
    1. SQL查询性能优化
    复制代码
    ,后者在于
    1. SQL 语句动态生成
    复制代码
    。下面我们来具体分析一下:
  • MySQL 版本:
  1. SELECT VERSION();

  2. 5.7.44

  3. # 数据构造 SQL
  4. CREATE TABLE IF NOT EXISTS t_user
  5. (
  6.   id INT not null auto_increment primary key comment '自增ID',
  7.   name varchar(20) comment '姓名',
  8.   age tinyint  comment '年龄'
  9. )ENGINE = INNODB;


  10. INSERT INTO t_user ( NAME, age ) VALUES ( '张三', 18 ),( '李四', 19 ),( '王五', 20 ),( '司总', 21 );
复制代码
where 1=1


  • 在 5.7 以上版本中,
    1. SQL查询性能优化
    复制代码
    会将
    1. 1=1
    复制代码
    部分优化掉,并不会影响索引,但网上有部分资料说在低版本中有一定影响,所以需要稍微留意一下。
  1. # 注:需要选中一起执行可以查看到优化后的 SQL
  2. explain select * from t_user where 1=1 AND name = '张三';
  3. show warnings;

  4. # 优化后的 SQL
  5. /* select#1 */ SELECT
  6. `mydatabase`.`t_user`.`id` AS `id`,
  7. `mydatabase`.`t_user`.`name` AS `name`,
  8. `mydatabase`.`t_user`.`age` AS `age`
  9. FROM
  10.         `mydatabase`.`t_user`
  11. WHERE
  12.         (
  13.         `mydatabase`.`t_user`.`name` = '张三')
复制代码

  • 从优化后的
    1. SQL
    复制代码
    可以看到,
    1. 1=1
    复制代码
    部分已经被查询优化器优化掉,所有对整体的性能影响并不大。
  1. # 性能对比
  2. select * from t_user where 1=1 AND name = '张三'
  3. > OK
  4. > 查询时间: 0.046s

  5. select * from t_user where 1=1
  6. > OK
  7. > 查询时间: 0.046s
复制代码
<where> 标签


  • 相比于
    1. where 1=1
    复制代码
    在 MySQL 中服务器层由查询优化器进行处理,
    1. <where>
    复制代码
    标签在动态构建
    1. SQL
    复制代码
    中处理,但性能也无很大影响,因为本质并不是很复杂的动态
    1. SQL
    复制代码
    生成。

总结


    1. where 1=1
    复制代码
    1. <where>
    复制代码
    标签是多条件拼接的两种常见写法,性能层面而言并没有较大的影响,具体选择何种写法可以根据团队的规范决定。
  • 此外两种方案的处理与处理的数据量无关,一次执行都仅处理一次,所以在大数据量下也无性能差异。
以上就是深入探究MySQL中使用where 1=1是否存在性能影响的详细内容,更多关于MySQL where 1=1性能影响的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/database/315948c2q.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具