首页 > 解决方案 > 如何解决 Keystone.js 中的“N+1”问题

问题描述

看来,Keystone.js 并没有提供“N+1”问题的解决方案。也许,它们是一些插件?

标签: query-optimizationkeystonejs

解决方案


你在哪个版本?当前版本的 KeystoneJS ( Keystone Next ) 构建在Prisma之上,它应该构建相当高性能的数据库查询。如果您正在执行的特定 GraphQL 查询导致 SQL 不理想,则它可能表示 Keystone 或 Prisma 代码中的错误,在这种情况下,如果您可以隔离问题并记录问题,那就太好了

如果您要添加查询数据库的挂钩、访问控制或虚拟字段,则可能会遇到 N+1 问题,因为可以为查询中返回的每个项目调用这些函数。例如,从virtual-fields示例中提取的这段代码如果按原样使用会导致 N+1 个查询:

Post: list({
  fields: {
    // [... various fields ...]

    author: relationship({ ref: 'Author.posts', many: false }),

    // A virtual field which uses `item` and `context` to query data.
    authorName: virtual({
      field: schema.field({
        type: schema.String,
        async resolve(item, args, context) {
          const { author } = await context.lists.Post.findOne({
            where: { id: item.id },
            query: 'author { name }',
          });
          return author && author.name;
        },
      }),
    }),
  },
}),

在这里,将为每个加载的项目调用该字段的解析器函数authorName(假设查询该字段)。在这些情况下,我建议在 Keystone CRUD API 之上使用类似GraphQL 数据加载器(或类似的)的东西。如果使用正确,dataloader 可以组合多个查询并解决 N+1 行为。


推荐阅读