query-optimization - 如何解决 Keystone.js 中的“N+1”问题
问题描述
看来,Keystone.js 并没有提供“N+1”问题的解决方案。也许,它们是一些插件?
解决方案
你在哪个版本?当前版本的 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 行为。
推荐阅读
- flash - Hittestpoint 不适用于相机(adobe as3)
- grails - 如何将数据永久保存在grails中?
- polymer - 如何将EventListener添加到在dom-repeat模板中加载了iron-ajax的Polymer 2.0 Iron-forms
- c# - 如何以管理员身份运行 CodeDom 编译的应用程序?
- python - 获取“ ValueError:无法将字符串转换为浮点数:'。' " 当输入应该被接受为浮点数时
- ios - Chrome 可以在 iOS 上运行角渐进式网络应用程序吗?
- .htaccess - htaccess 如何从 URL 中删除 /home
- spring - 代码实现:Hamcrest Matcher 接口和 BaseMatcher 抽象类
- blob - Javascript Fetch:如何用奇怪的背景颜色修复下载的 blob?
- php - 将带有子查询的 sql 更新转换为 dql