TypeORM中数据更新操作save()与update()方法哪个性能更好?
save() 与 update() 数据更新的效率差异及选型
先给明确结论:确定是更新已有记录的场景下,update()执行效率比save()高得多,两者的性能差距来自ORM内部的执行逻辑差异:
save()的执行流程
你现在调用的save({ id: id, data }),看起来是直接传id和更新字段就完事,实际上ORM内部会先执行一次主键查询:
先查出这条id对应的完整实体记录,把你传入的更新字段合并到查出来的实体实例上,之后才会生成UPDATE语句执行。如果你的实体定义里配置了关联关系级联规则、SELECT * FROM 目标表 WHERE id = ?@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
相关产品推荐
相关产品推荐

