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

DynamoDB全局二级索引使用contains运算符查询的效率及合理性问题

结论

你设计的方案无法发挥GSI的查询效率优势,执行逻辑和全表Scan基本一致,不建议在生产环境使用。

方案无效的核心原因
  • DynamoDB的全局二级索引(GSI)仅支持对索引分区键做精确等值匹配触发高效的索引查询,contains属于模糊匹配运算符,不支持作为GSI分区键的查询条件。
  • 你将contains放在过滤表达式中执行时,DynamoDB会先扫描整个GSI的全量数据,再逐行校验过滤条件,不仅会消耗和全表Scan等量的读容量,延迟也会随数据量增长线性上升。
推荐的正确实现方案

针对“查询包含指定code的所有文档”的场景,可采用多写稀疏GSI的设计:

  1. 新增GSI分区键字段entity_code_pk,写入文档时,针对entities数组中的每一个code,都写入一条对应的副本数据,每条副本的entity_code_pk分别设置为单个entity.code的值,其余字段和原文档完全一致。
  2. 给entity_code_pk字段创建GSI,查询时直接指定GSI的分区键条件为entity_code_pk = 待查询的code值,即可直接命中所有符合条件的文档,查询效率为最优的O(1)级别,读容量消耗仅和匹配的条目数量有关。
  3. 如果单条文档包含多个匹配的code,查询会返回重复的文档数据,仅需在应用层做简单去重即可。
备选方案(仅适合极小数据量场景)

如果你的表总数据量小于1万条、查询QPS极低,可以直接对原表做Scan操作,配合contains(entities[*].code, :codeVal)的过滤表达式实现需求,不需要额外新增字段和索引,但不适合中大规模生产环境使用。

内容的提问来源于stack exchange,提问作者Andrey Yaskulsky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:06:03