MyBatis 动态 SQL 高频性能优化方案

一、核心底层原理先懂

动态 SQL 本质:XML 节点解析 → OGNL 表达式判断 → SQL 字符串拼接 → 预编译 ParameterMapping 绑定 性能瓶颈集中在:OGNL 慢、无效分支多、SQL 膨胀、索引失效、预编译缓存失效

1. 精简 OGNL 判断,减少表达式计算开销

❌ 坏习惯:重复判断、复杂逻辑、空字符串无脑判断

sql 复制代码
<!-- 冗余、低效 -->
<if test="username != null and username != '' and username.trim() != ''">

✅ 优化:

  • 统一入参校验,后端先判空,XML 只做非 null 核心判断
  • 避免在test里调用复杂方法、嵌套运算
  • 字符串场景:业务统一封装,杜绝多层 trim

原理:OGNL 是反射执行,表达式越复杂,解析耗时越高

2. 优先用 <where>/<set> 杜绝语法冗余 & 硬编码

禁止手写 where 1=1

  • 极易造成数据库优化器选错执行计划、无法走索引过滤
  • <where> 晚阶段剔除 and/or,SQL 更精简、缓存命中率更高

3. <choose> 替代多互斥 <if>,减少无效分支匹配

互斥查询条件(id / 手机号 / 用户名唯一查询)

不要多个并行 if,用 choose 保证只命中一个分支

减少 SQL 拼接分支数量、减少预编译变体

4. <foreach> 批量场景硬核优化(重点)

  1. 控制集合长度 MySQL in 查询建议单次 ≤500 个,超量分批拆分避免超长 IN 列表导致:语法解析慢、索引失效、临时表排序
  2. 批量插入:
    • 禁用单条循环 insert,用 foreach 拼接 values 批量语法
    • MySQL 配置 rewriteBatchedStatements=true 加速
  3. 属性规范:严格指定collection:入参 List 写 list、数组写 array,避免反射推断耗时5. 减少动态嵌套层级
  4. 避免多层:where → if → foreach → if 深度嵌套嵌套越深,MyBatis 节点遍历、解析、渲染开销越大

5. 减少动态嵌套层级

避免多层:where → if → foreach → if 深度嵌套嵌套越深,MyBatis 节点遍历、解析、渲染开销越大

三、SQL & 数据库执行层面优化(解决慢查询根源)

1. 防止动态条件导致 索引失效

高频坑:

  • 动态拼接左右模糊查询 %xxx%
  • 动态函数包装字段:date(col)=#{time}优化:前置静态索引字段、统一等值匹配、范围查询受控使用

2. 固定主干 SQL,提升 MyBatis & JDBC 预编译缓存

动态 SQL 最怕:每次生成不一样的 SQL 文本导致:

  • MyBatis Statement 缓存失效
  • 数据库连接池预编译 SQL 缓存淘汰做法:
  1. 公共查询字段、表名、排序主干写死
  2. 仅过滤条件动态拼接,缩小 SQL 变体数量

3. 禁用无用动态排序 / 分页漂移

动态 order by 极易造成:文件排序、执行计划抖动能静态固化就不动态;必须动态要做白名单校验防注入 + 固定索引排序

相关推荐
电商API_1800790524739 分钟前
淘宝商品评论数据获取指南|批量自动化|api应用
java·爬虫·spring·性能优化·自动化
布局呆星43 分钟前
Spring Boot+MyBatis-Plus+Vue3前后端协作Note
spring boot·typescript·vue·mybatis
学网安的肆伍1 小时前
【044-WEB攻防篇】PHP应用&SQL盲注&布尔回显&延时判断&报错处理&增删改查方式
前端·sql·php
空中海1 小时前
MyBatis 知识框架图、性能优化与面试题
性能优化·mybatis
桃花键神3 小时前
【2026精品项目】基于SpringBoot3+Vue3的校园小卖铺系统(包含源码+项目文档+SQL脚本+部署教程)
数据库·sql·vue·毕业设计·springboot
其实防守也摸鱼3 小时前
全新安装 SQL Server 并直接设置数据目录到 E 盘 完整步骤
数据库·sql·网络安全·sqlserver·教程·工具
江南十四行3 小时前
Python性能优化完全指南——剖析、缓存与C扩展
python·缓存·性能优化
Devin~Y3 小时前
大厂Java面试:Spring Boot + Redis/Kafka + Spring Cloud + JVM + RAG/向量检索(小Y翻车实录)
java·jvm·spring boot·redis·spring cloud·kafka·mybatis
zxrhhm4 小时前
PostgreSQL 分页性能优化 FETCH WITH TIES 与传统 LIMIT/OFFSET 的对比
数据库·postgresql·性能优化
剑神一笑4 小时前
Linux find 命令深度解析:从递归遍历到性能优化的完整实现
linux·运维·性能优化