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

两段Prisma数据库操作代码性能对比:哪种实现更高效?

批量处理数据库数据的两种实现对比

假设需要处理100条数据库数据,以下是两种不同的代码实现方案:

方案一:批量操作实现

const existingProductStock = await prisma.stock.findMany({
  where: {
    productId: {
      in: procurement.flatMap((item) => item.productId),
    },
  },
});

const formattedNewestProduct = procurement.map((item) => {
  return {
    productId: item.productId,
    stock: item.quantity,
  };
});
const formattedOldestProduct = existingProductStock.map((item) => {
  return {
    productId: item.id,
    stock: item.stock,
    unitName: item.unitName,
  };
});
let combinedProductData = [
  ...formattedNewestProduct,
  ...formattedOldestProduct,
];

let productResult = combinedProductData.reduce(
  (
    acc: { productId: string; stock: number; unitName?: string }[],
    val
  ) => {
    let similarData = acc.find(
      (item) => item.productId === val.productId
    );
    if (similarData) {
      similarData.stock += val.stock;
    } else {
      acc.push({ ...val });
    }
    return acc;
  },
  []
);

await prisma.stock.deleteMany();
await prisma.stock.createMany({
  data: productResult.map((item) => {
    return {
      ...item,
      unitName: item.unitName ?? "",
    };
  }),
});

方案二:循环单条操作实现

for (const item of data) {
  const product = await prisma.product.findUnique({
    where: { id: item.productId },
    include: {
      stock: true,
    },
  });

  if (
    product &&
    (product.stock ? product.stock.stock : 0) >= item.quantity
  ) {
    await prisma.product.update({
      where: { id: item.productId },
      data: {
        stock: {
          update: {
            data: {
              stock: { decrement: item.quantity },
            },
          },
        },
      },
    });
  } else {
    await prisma.product.update({
      where: { id: item.productId },
      data: {
        stock: {
          update: {
            data: {
              stock: { decrement: product?.stock?.stock },
            },
          },
        },
      },
    });
  }
}

性能差异对比

  • 方案二采用循环单条处理逻辑,每处理一条数据都会发起一次findUnique查询和一次update操作,处理100条数据时总计会产生200次数据库请求。
  • 方案一通过批量操作优化数据库交互:先批量查询现有库存数据,在内存中完成数据映射、合并与聚合,最后批量删除旧数据并写入新数据,全程仅需3次数据库请求。虽然增加了前端的数组处理逻辑,但大幅降低了数据库交互次数,在数据量较大时性能优势显著。

内容的提问来源于stack exchange,提问作者Rolando Suak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:34:50