You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:10:06