我有一个非常简单的设置。带有MongoDB数据库的Express-GraphQL API。MongoDB的响应通常相当快,但是当我想从TTFB返回时,GrapQL花费的时间太长了,特别是对于多用户查询。
例如,当我请求用户时,TTFB是25.65ms,内容下载大约是0.6ms。但是,当我请求所有具有相同字段的用户时,TTFB是4.32s,内容下载大约是1.28s。
内容下载没问题,但我觉得TTFB太长了。你可以用下面的RootQuery检查我的架构的一部分。
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
user: {
type: UserType,
args: {mail: {type: GraphQLString}},
resolve(parent, args){
return User.findOne({mail: args.mail});
}
},
users: {
type: new GraphQLList(UserType),
resolve(parent,args){
return User.find({}).collation({ locale: "en" }).sort({name: 1, surname: 1});
}
}
}
});降低TTFB的最好方法是什么?
发布于 2019-07-23 23:14:45
从您的代码片段中,我看不到UserType是如何定义的,我也不知道您正在执行的graphql查询到底是如何定义的。话虽如此,较高的TTFB数字通常表示服务器正在执行繁重的任务,因此,很可能您正在从查询中的UserType请求一个字段,该字段与一个昂贵的解析器相关联(可能执行另一个MongoDB查询),该解析器将在用户存在的情况下被执行多次。这就是所谓的N+1问题,您可以使用dataloder来解决这个问题,这将允许您在一个查询中批量处理那些代价高昂的MongoDB查询。
如果您可以提供有关UserType和正在执行的查询的更多信息,这将会有很大帮助。
参考资料:- https://itnext.io/what-is-the-n-1-problem-in-graphql-dd4921cb3c1a - https://github.com/graphql/dataloader
https://stackoverflow.com/questions/57166906
复制相似问题