为什么要做性能优化?
当数据量变大后,即使是 Prisma 这样的 ORM,如果查询设计不合理,也会出现接口变慢、数据库压力过高甚至服务崩溃的问题。
常见性能问题
N+1 查询问题
循环查询导致数据库请求暴增
无索引查询
全表扫描导致性能下降
深层 include
嵌套查询过深影响性能
冗余字段查询
返回过多无用数据
N+1 查询问题
n1-bad.ts
typescript
const users = await prisma.user.findMany();
for (const user of users) {
const posts = await prisma.post.findMany({
where: { userId: user.id }
});
}上面的代码会对每个用户执行一次数据库查询,当用户数量变多时,会产生严重性能问题(N + 1 次查询)。
正确做法:一次性查询
n1-good.ts
typescript
const users = await prisma.user.findMany({
include: {
posts: true
}
});通过 include 一次性加载关联数据,可以避免循环查询,大幅减少数据库压力。
数据库索引优化
schema.prisma
prisma
model Post {
id Int @id @default(autoincrement())
title String
userId Int
@@index([userId])
}索引可以让数据库在查询 userId 时避免全表扫描,显著提升查询速度。
多字段索引
index.prisma
prisma
model Post {
id Int @id @default(autoincrement())
title String
userId Int
status String
@@index([userId, status])
}避免深层 include
deep.ts
typescript
const data = await prisma.user.findMany({
include: {
posts: {
include: {
comments: {
include: {
user: true
}
}
}
}
}
});嵌套层级过深会导致 SQL join 复杂度指数级增长,应尽量避免超过 2 层嵌套。
优化策略总结
性能优化原则
减少查询次数
避免 N+1 问题
合理使用索引
优化 where 查询
控制 include 层级
避免深层嵌套
减少返回字段
结合 select 使用
下一步学习
进入高级阶段
事务处理
Prisma transaction
生产部署优化
连接池 / serverless
相关笔记
在数字化一期,此笔记未产生更深相关的共鸣分枝。