当前位置: 首页 > news >正文

【sql优化】where 1=1

文章目录

  • where 1=1
    • 问题描述
    • 错误实现
    • 正确实现
    • 性能对比测试

where 1=1

问题描述

在动态 SQL 拼接场景中,开发者常使用 WHERE 1=1 简化条件拼接逻辑(避免处理首个条件的 AND)。理论上,数据库优化器会忽略 1=1,但字符串拼接可能带来性能损耗,部分数据库优化器可能无法完全优化 1=1,导致索引失效或全表扫描。建议使用<where> 标签替代 WHERE 1=1 。

错误实现

select *
from job_info
where 1=1
<if test="jobName != null and jobName != '' ">
    <bind name="jobNameBind" value="'%' + jobName + '%'"/>
    and job_name like #{jobNameBind}
</if>

正确实现

select *
from job_info
<where>
<if test="jobName != null and jobName != '' ">
     <bind name="jobNameBind" value="'%' + jobName + '%'"/>
    job_name like #{jobNameBind}
</if>
</where>

性能对比测试

  • 数据库:mysql-8.0.29

  • EXPLAIN测试对比:

EXPLAIN SELECT * FROM koca_order WHERE 1=1 AND order_id > 1012

EXPLAIN SELECT * FROM koca_order WHERE order_id > 1012
idselect_typetypepossible_keysrowsfilteredExtra
1SIMPLEALLPRIMARY60033.33Using where
  • JMH测试:
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
@Fork(3)
@Warmup(iterations = 5, time = 2)
@Measurement(iterations = 5, time = 5)
@Threads(16)
public class WhereConditionBenchmark {

    private List<String> conditions;

    @Setup
    public void setup() {
        // 模拟 5 个动态查询条件
        conditions = Arrays.asList("age > 18", "status = 1", "name LIKE 'John%'", "city = 'NY'", "score >= 60");
    }

    /**
     * 原始实现:使用 WHERE 1=1 简化拼接
     */
    @Benchmark
    public void withDummyCondition(Blackhole bh) {
        StringBuilder sql = new StringBuilder("SELECT * FROM users WHERE 1=1");
        for (String cond : conditions) {
            sql.append(" AND ").append(cond);
        }
        bh.consume(sql.toString()); // 避免 JIT 优化
    }

    /**
     * 优化实现:直接拼接 WHERE 条件
     */
    @Benchmark
    public void withoutDummyCondition(Blackhole bh) {
        StringBuilder sql = new StringBuilder("SELECT * FROM users");
        boolean first = true;
        for (String cond : conditions) {
            if (first) {
                sql.append(" WHERE ");
                first = false;
            } else {
                sql.append(" AND ");
            }
            sql.append(cond);
        }
        bh.consume(sql.toString());
    }

}

测试结果:

Benchmark                                          Mode  Cnt      Score      Error   Units
TT.WhereConditionBenchmark.withDummyCondition     thrpt   15  16509.986 ± 3028.386  ops/ms
TT.WhereConditionBenchmark.withoutDummyCondition  thrpt   15  20124.583 ±  420.773  ops/ms

测试结论:

移除冗余的 WHERE 1=1 后,吞吐量提升约 21.9%,说明 1=1 对动态 SQL 生成性能有明显影响。

相关文章:

  • 游戏引擎学习第187天
  • nginx配置跳转设置Host有误导致报404问题
  • 洛克人2游戏秘籍
  • 一种监控录像视频恢复的高效解决方案,从每一帧中寻找可能性
  • 小样本学习综述2025
  • Vulnhub:Digitalword.local: FALL靶机渗透
  • 海拔案例分享-新华书店新零售系统开发解决方案
  • 自然语言处理,能否成为人工智能与人类语言完美交互的答案?
  • HTML~视频音频在网页中不能自动播放
  • 项目-苍穹外卖(十五) Apache ECharts+数据统计
  • 腾讯混元 T1 正式发布:混合架构重塑推理模型范式,解码速度提升 2 倍
  • java项目之基于ssm的新生报到系统(源码+文档)
  • 向内求解人生
  • Socket函数用法详解
  • 人工智能技术全景图谱:从基础理论到前沿应用
  • Java-servlet(八)详细讲解get请求和post请求的区别,get请求和post请求分别在哪种场景使用
  • 数据结构——单链表(C语言)
  • 《Operating System Concepts》阅读笔记:p489-p489
  • 编译原理——自底向上语法优先分析
  • linux中如何获取其他进程的退出状态
  • 怎么弄网站/优化模型数学建模
  • 台州找人做网站/2022新闻热点10条
  • 做网站可以赚钱吗知乎/uc信息流广告投放
  • 网站策划编辑如何做/跨境电商培训
  • 做b2b网站项目技巧/推广注册app拿佣金平台
  • 建设部网站水利设计资质/深圳网页设计公司