You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeORM中数据更新操作save()与update()方法哪个性能更好?

save() 与 update() 数据更新的效率差异及选型

先给明确结论:确定是更新已有记录的场景下,update()执行效率比save()高得多,两者的性能差距来自ORM内部的执行逻辑差异:

  • save()的执行流程
    你现在调用的save({ id: id, data }),看起来是直接传id和更新字段就完事,实际上ORM内部会先执行一次主键查询:
    SELECT * FROM 目标表 WHERE id = ?
    
    先查出这条id对应的完整实体记录,把你传入的更新字段合并到查出来的实体实例上,之后才会生成UPDATE语句执行。如果你的实体定义里配置了关联关系级联规则、@BeforeUpdate/@AfterUpdate这类生命周期钩子,这些逻辑也会在整个流程里全量触发,额外加不少运算和IO开销。
  • update()的执行流程
    这个方法是专门面向更新操作设计的,不会做前置的记录存在性查询,也不会触发实体上的钩子、级联逻辑,直接根据你传入的条件和更新字段生成UPDATE语句发给数据库执行,省掉了前置查询的网络IO,也没有ORM层实体实例化、字段合并的额外运算成本。
// update() 等价写法,直接传主键id和更新字段即可
this.repo.update(id, data)
  • 选型参考
    • 必须用save()的场景:需要触发实体绑定的生命周期钩子、需要级联更新关联表数据、不确定记录是否存在要实现"存在即更新,不存在即插入"的upsert逻辑
    • 优先用update()的场景:明确知道id对应记录存在、只需要更新表字段、不需要触发级联和钩子逻辑,尤其是批量更新场景,update()可以生成单条批量更新SQL,save()会逐条做查询+更新,性能差距会拉到数倍甚至数十倍。

补充:如果既想要upsert能力,又想避免save()的前置查询开销,可以用ORM提供的upsert()方法,直接基于数据库的原生upsert语法实现,性能比save()好很多。

内容的提问来源于stack exchange,提问作者zaheer shaikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 09:45:32