2017-05-25 87 views
0

我一直在阅读关于使用GSI的最佳方式的问题,而这一个DynamoDB : Global Secondary Index utilisation in queries接近我所需要的,但我仍然有几个问题。Dynamodb GSI查询:排序键扮演什么角色

我遇到的情况,我有一个领域的产品表:

product_id (partitions_key), product_name, launch_year, manufacturer 

我需要做以下三种类型的查询:基于PRODUCT_NAME

1. product_name=? 
2. product_name=? AND launch_year=? 
3. product_name=? AND manufacturer=? 

从我的理解创造一个GSI将服务器全部3个目的。 我想了解的是,将增加2个GSI与launch_year和制造商作为排序键加快查询2和3?排序键的唯一目的是返回排序数据还是将Dynamodb查询以某种方式利用感兴趣的字段排序的事实?

+0

也许你想了解二进制搜索 –

+0

所以我认为dynamodb查询在这种情况下使用二分法搜索而不是线性搜索? – user2703829

+0

是的,这是索引的唯一目的:创建排序的副本以避免完整扫描 –

回答

0

无需再创建两个索引。原因是: -

  1. 这会增加额外的成本。拥有多个GSI会导致读取和写入容量单位成本增加
  2. 另外,对于上述两种使用情况,这不是必需的。您可以使用FilterExpressions来过滤数据launch_yearmanufacturer
  3. 另一种选择是只有一个GSI product_namelaunch_year。所以你有2个用例。对于第三次的使用情况,您可以使用FilterExpression
  4. 在所有这些选项,你仍然可以使用查询API,你有分区键product_name
+0

谢谢。成本观点是有道理的。 #3是一个聪明的想法,我会考虑它。 – user2703829

+0

如果有用,请接受答案。谢谢! – notionquest

+0

针对#3的@notionquest,即product_name和launch_year(复合)上有GSI,如果我的记录中有少数记录的值为null,则launch_year和non null product_name。我认为,在仅使用product_name查询此GSI表时,不会提取具有null launch_year的记录。由于发电机组不会将此记录填充到GSI表中。请纠正我。 – Somil

相关问题