两段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
相关产品推荐
相关产品推荐

