严格来说,“动态 SQL 性能更优”这个说法并不绝对,它是否更优,取决于使用场景和实现方式。很多人觉得动态 SQL“性能更好”,主要是因为它更灵活、能减少不必要的工作、并能生成更高效的执行计划。下面从原理和实际场景解释。
动态 SQL 是指 SQL 语句在运行时才拼接或生成,而不是在代码中写死。
例如(MyBatis 示例):
SELECT * FROM user
WHERE 1=1
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
静态 SQL 往往要写死所有条件:
SELECT * FROM user WHERE name = ? AND age = ?
如果用户只传了 name,数据库仍可能:
动态 SQL 只加有效条件,更容易走索引。
✅ 结果:扫描行数更少,查询更快
动态 SQL 可以:
<if test="needOrder">
LEFT JOIN orders o ON o.user_id = u.id
</if>
静态 SQL 永远 JOIN,即使不需要。
✅ 结果:减少 IO 和计算
数据库优化器依赖:
动态 SQL 生成的是更贴近真实需求的 SQL,优化器更容易选对索引。
常见反例(性能差):
SELECT * FROM user
WHERE (name = #{name} OR #{name} IS NULL)
这种写法常常:
动态 SQL 直接消除该条件,性能更好。
如果每行请求生成的 SQL 字符串都不同:
SELECT * FROM user WHERE id=1
SELECT * FROM user WHERE id=2
数据库无法复用执行计划。
✅ 解决:使用 预编译 + 参数绑定
错误示例:
"WHERE name = '" + name + "'"
所有字段都可变 → SQL 太复杂 → 优化器反而选错计划
动态 SQL 本身并不一定更快,它之所以“看起来性能更优”,是因为:
- 只执行必要的逻辑
- 更容易命中索引
- 减少无意义的扫描和计算
✅ 用得好:性能更优
❌ 用得差:反而更慢
如果你愿意,我可以:
你现在用的是哪种数据库或框架?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。