【发布时间】:2021-12-31 14:24:19
【问题描述】:
我已经尝试了两种方法(光标和偏移)来对我的 ~1000 文档数据库进行分页,但是,我无法让光标比偏移快。
// 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,我认为它不应该这样做?)
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
// 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() 而运行得更快,但是有没有办法让光标分页以超快的速度返回所有文档?
【问题讨论】:
标签: node.js postgresql prisma