GraphQL - 数据库过载?
GraphQL - Overloading database?
我正在研究 GraphQL,我想了解 GraphlQL 将如何执行查询谎言:
poc (id: $id) {
tradingName
id
products{
id
title
imageUrl
productVariants {
title
}
images{
url
}
}
}
在 resolve_all_products
我将只查询产品的 ID。
例如select * from products where poc_id=10
在 resolve_product_variants
节点上,我将查询具有特定产品 ID 的所有产品变体。
例如select * from product_variants where product_id=X
现在假设我有 20 种产品,每种都有 2 个产品变体。
所以我将进行一次查询以获取所有产品 (20),然后再查询 20 个。他们每个人都将从特定产品中获取所有产品变体 (2)。
因此,我将执行 21 个查询,而不是单个连接查询。我对吗?
有什么办法可以防止这种情况吗?
是的,你是对的。它将执行 21 个查询。这称为 N+1 查询问题。
DataLoader可以用来优化这个。
首先定义一个DataLoader
const DataLoader = require('dataloader');
const productVariantsLoader = new DataLoader((productIds) => // productIds will be an array of product ids
sql.table.query(`select * from product_variants where product_id in $productIds`)
)
然后在 productVariants
、
的解析器中
function productVariants(product) { // Resolver for productVariants
return productVariantsLoader.load(product.id)
}
就是这样。现在 productVariants resolve 可能会被调用很多次;但传递的产品 ID 将由 DataLoader 收集,并且 SQL 查询函数将仅调用一次。
我正在研究 GraphQL,我想了解 GraphlQL 将如何执行查询谎言:
poc (id: $id) {
tradingName
id
products{
id
title
imageUrl
productVariants {
title
}
images{
url
}
}
}
在 resolve_all_products
我将只查询产品的 ID。
例如select * from products where poc_id=10
在 resolve_product_variants
节点上,我将查询具有特定产品 ID 的所有产品变体。
例如select * from product_variants where product_id=X
现在假设我有 20 种产品,每种都有 2 个产品变体。 所以我将进行一次查询以获取所有产品 (20),然后再查询 20 个。他们每个人都将从特定产品中获取所有产品变体 (2)。
因此,我将执行 21 个查询,而不是单个连接查询。我对吗? 有什么办法可以防止这种情况吗?
是的,你是对的。它将执行 21 个查询。这称为 N+1 查询问题。
DataLoader可以用来优化这个。
首先定义一个DataLoader
const DataLoader = require('dataloader');
const productVariantsLoader = new DataLoader((productIds) => // productIds will be an array of product ids
sql.table.query(`select * from product_variants where product_id in $productIds`)
)
然后在 productVariants
、
function productVariants(product) { // Resolver for productVariants
return productVariantsLoader.load(product.id)
}
就是这样。现在 productVariants resolve 可能会被调用很多次;但传递的产品 ID 将由 DataLoader 收集,并且 SQL 查询函数将仅调用一次。