如何在AWS AppSync中实现类左连接并替代Filter扫描操作?
嘿,我来帮你搞定这个DynamoDB关联查询的性能问题!
你的核心痛点是当前查询里的filter会触发Scan操作,效率低下——这是因为你给UserMaintenanceHistory定义的byRecomendationsMasterId索引只用到了RecomendationsMasterId作为分区键,没有把uservehicleId纳入索引结构,导致没法精准定位数据,只能扫描过滤。
不用自定义解析器也能解决,只需要调整一下你的GraphQL模型里的索引定义,让关联查询能走高效的Query操作:
第一步:修改UserMaintenanceHistory的索引
把原来的byRecomendationsMasterId索引改成复合索引,把uservehicleId作为排序键加进去:
type UserMaintenanceHistory @model @key(name: "byUserVehicleId", fields: ["uservehicleId"]) @key(name: "byRecomendationsMasterIdAndUserVehicle", fields: ["RecomendationsMasterId", "uservehicleId"]) { id: ID! status: String actionTakenDate: AWSDateTime uservehicleId: ID! RecomendationsMasterId: ID! maintenanceCache: MaintenanceRecomendationsMaster @connection(fields: ["RecomendationsMasterId"]) }
第二步:更新MaintenanceRecomendationsMaster的关联字段
在history的@connection注解里指定新的索引名称,同时声明排序键字段:
type MaintenanceRecomendationsMaster @model @key(name: "byrecomendID", fields: ["recomendId"], queryField: "byrecomendID") { id: ID! recomendId: Int! displayName: String! history: [UserMaintenanceHistory] @connection(keyName: "byRecomendationsMasterIdAndUserVehicle", fields: ["id"], sortKeyFields: ["uservehicleId"]) }
第三步:使用优化后的查询
现在你可以直接传入uservehicleId作为查询参数,不用再依赖filter了:
query byrecomendIdQuery{ byrecomendId(recomendId: 100) { items { id displayName history(uservehicleId: "1") { items{ status actionTakenDate } } } } }
为什么这样有效?
新的复合索引byRecomendationsMasterIdAndUserVehicle把RecomendationsMasterId作为分区键,uservehicleId作为排序键——当你从MaintenanceRecomendationsMaster关联查询history时,Amplify会自动用这个索引执行Query操作,精准定位到对应uservehicleId的记录,彻底避免了Scan的性能问题。
最后别忘了运行amplify push重新部署你的API,让新的索引生效哦!
内容的提问来源于stack exchange,提问作者user20358
相关产品推荐
相关产品推荐

