我尝试过这两种方法(游标和偏移量)通过我的~1000 doc分页,但是,我不能让游标比偏移量更快。
代码语言:javascript复制// cursor method
const allDocs = []
let queryResults = await prismaClient.obsidian.findMany({
take: 100
})
while (queryResults.length > 0) {
allDocs.push(...queryResults)
queryResults = await prismaClient.obsidian.findMany({
take: 100,
skip: 1,
cursor: {
id: queryResults[queryResults.length - 1]!.id
}
})
}
return allDocs用~25秒完成(注:它似乎在使用OFFSET,我以为它不应该这么做?)
代码语言:javascript复制Query: SELECT "public"."obsidian"."id", "public"."obsidian"."doc", "public"."obsidian"."createdAt", "public"."obsidian"."updatedAt", "public"."obsidian"."filename" FROM "public"."obsidian", (SELECT "public"."obsidian"."id" AS "obsidian_id_0" FROM "public"."obsidian" WHERE ("public"."obsidian"."id") = ($1)) AS "order_cmp" WHERE "public"."obsidian"."id" >= "order_cmp"."obsidian_id_0" ORDER BY "public"."obsidian"."id" ASC LIMIT $2 **OFFSET** $3代码语言:javascript复制 // offset method
const count = await prismaClient.obsidian.count()
const pages = Math.ceil(count / 100)
const allDocsPromises = []
for (let i = 0; i < pages; i++) {
const page = prismaClient.obsidian.findMany({
skip: i * 100,
take: 100
})
allDocsPromises.push(page)
}
const allDocs = await Promise.all(allDocsPromises)
return _.flatten(allDocs)用~14秒完成。我的想法是,offset方法由于Promise.all()而运行得更快,但是是否有一种方法可以使光标分页以超快的速度返回所有文档?