DynamoDB:查询中的全局二级索引利用率

Posted

技术标签:

【中文标题】DynamoDB:查询中的全局二级索引利用率【英文标题】:DynamoDB : Global Secondary Index utilisation in queries 【发布时间】:2016-12-01 01:04:15 【问题描述】:

我来自 RDMS 背景,最近开始使用 DynamoDB。

我有以下带有三个全局二级索引 (GSI) 的 DynamoDB 表

Id(主键)、user_id(GSI)、event_type(GSI)、product_id(GSI) ) , 率, 创建日期

我有以下三种查询模式:

a) 在哪里 event_type=? b) 在哪里 event_type=? AND product_id=? c) 在哪里 product_id=? d) 在哪里 product_id=? AND user_id=?

我知道在 mysql 中我需要创建以下索引来优化上述查询:

复合索引(event_type,product_id):用于查询“a”和“b” 复合索引(product_id,user_id):用于查询“c”和“d”

我的问题是,如果我在 DyanomoDB 中为“event_type”、“product_id”和“user_id”字段创建三个 GSI,查询模式“b”和“d”是否利用这三个独立的 GSI?

【问题讨论】:

DynamoDB 是基于 indexedDB 的吗? indexedDB 是浏览器支持的嵌入式数据库,可通过 javascript 访问。如果您的问题与此无关,请删除标签。 【参考方案1】:

首先,与 RDBMS 不同,Dynamodb 不会根据过滤器表达式中使用的字段来选择 GSI(我的意思是没有 SQL 优化器可以根据 SQL 中使用的字段来选择适当的索引)。

您必须直接查询 GSI 才能获取数据。您可以参考 GSI 查询页面以了解更多信息。

您可以创建两个 GSI:-

1) 事件类型

2) 产品编号

您确保在 GSI 中包含其他必填字段,尤其是产品 ID、用户 ID 和任何其他必填字段。这样,当您查询 GSI 时,您将获得满足用例所需的所有字段。只要您有一个来自 GSI 的字段,您就可以在 Filter 表达式中包含其他字段来过滤数据。这可确保您不会创建需要额外空间和成本的不必要的 GSI。

【讨论】:

以上是关于DynamoDB:查询中的全局二级索引利用率的主要内容,如果未能解决你的问题,请参考以下文章

如何通过从 CloudFormation 中删除来从 DynamoDb 中删除全局二级索引?

使用全局二级索引的 DynamoDB 表查询项

并行执行DynamoDB查询(全局二级索引的BatchGetItems)

使用二级索引改进数据访问DynamoDB

如何在无服务器框架中使用全局二级索引定义 DynamoDB 表

使用aws cli将全局二级索引添加到DynamoDB中的现有表