如果您的访问模式包含许多 WHERE 条件,如何在 dynamodb 中建模数据

How to model data in dynamodb if your access pattern includes many WHERE conditions

如果这在 DynamoDB 中可行,我有点困惑。

我将给出一个 SQL 的示例并解释如何优化查询,然后我将尝试解释为什么我对如何建模以及如何访问 DynamoDB 中的相同数据感到困惑。

这不是公司代码。只是我根据 pcpartpicker 过滤器编造的一个例子。

SELECT * FROM BUILDS
WHERE CPU='Intel' AND 'OVERCLOCKED'='true'
AND Price < 3000
AND GPU='GeForce RTX 3060'
AND ...

根据我的理解,SQL 将首先对 BUILDS table 进行扫描,然后过滤掉所有 CPU 使用 intel 的构建。从这个子集中,它然后执行另一个 WHERE 子句来过滤 'OVERCLOCEKD' = true 等等。基本上,所有附加的 WHERE 子句都具有较少的要过滤的行数。

我们可以做的一件事来加速这个查询是在这些列上创建一个索引。性能的主要提高是减少了整个 table 数据库查看的第一个子句的初始扫描。因此,在上面的示例中,不是扫描整个数据库来查找使用英特尔的构建,而是可以快速检索它们,因为它已被编入索引。

您将如何在 DynamoDB 中为这些数据建模?我知道您可以创建一堆二级索引,而不是让引擎执行 WHERE 子句并将结果传递给下一组过滤。看起来你必须自己做所有这些。例如,我们需要使用我们的二级索引来查找所有使用 intel、超频、低于 3000 和使用特定 GPU 的构建,然后我们需要自己找到交集。有没有更好的方法来映射这种访问模式?我很难弄清楚这是否可能。

编辑: 我知道我也可以只使用普通过滤器,但看起来这会非常昂贵,因为它基本上通过 table 进行蛮力搜索,类似于没有索引的 SQL 解决方案。

要从 pcpartpicker 了解我的意思,这里是 link 到该页面的站点:https://pcpartpicker.com/builds/

人们基本上 select 多个过滤器,因此这使得访问模式的设计更加困难。

我强烈建议您浏览 YouTube 上的各种 AWS 演示文稿...

特别是 AWS re:Invent 2018 的 link 到 The Iron Triangle of Purpose - PIE Theorem 章节:使用 AWS 数据库构建:将您的工作负载与右数据库 (DAT301) 演示文稿。

DynamoDB 提供 IE - 无限规模和效率。

但你需要 P - 模式灵活性。

您需要决定是需要 PI 还是 PE。