【发布时间】:2017-05-04 07:39:53
【问题描述】:
我在 Node.js 中与 Apollo-Server 和 Express.js 一起使用 Sequelize。
在进行越来越深入的查询时,GraphQL 会循环我的模型并按 ID 对每个模型进行单独的查询。
例如,如果我得到user(userId) > playthroughs > scores,这将查找该用户(没问题),然后查找与该userId 相关的所有通关(仍然没什么大不了的),然后得到分数,它循环每个playthroughId 并对每个进行完全独立的查询。这是非常低效的,并且导致我的查询花费的时间比他们应该的要长。
而不是循环:
SELECT scoreValue
FROM scores
WHERE playthroughId = id
我真的很想自己抓取数组并像这样执行循环:
SELECT scoreValue
FROM scores
WHERE playthroughId IN (...ids)
当我去年使用 Facebook 的参考 GraphQL 时也发生了这种情况,所以我认为它不是特定于 Apollo 的实现。
我想知道如何调整这些查询,以免对性能造成如此大的影响。
解析器示例:
const resolvers = {
Query: {
user: (_, values) => User.findOne(formatQuery(values))
.then(getDataValues),
},
Playthrough: {
score: ({ playthroughId }) => Score.findOne(formatQuery({ playthroughId }))
.then(getDataValues),
},
User: {
playthroughs: ({ userId }, { take }) => Playthrough.findAll(formatQuery({ userId, take, order: 'playthroughId DESC' }))
.then(getAllDataValues),
},
}
【问题讨论】:
标签: mysql sequelize.js graphql-js apollostack apollo-server