当前位置: 首页 > 知识库问答 >
问题:

如何优化DynamoDB查询响应时间?

段兴为
2023-03-14

我们使用API网关Lambda函数DynamoDB来获取数据,并使用DynamoDB查询方法。对于260.4KB的数据(项目总计数:675 |扫描计数:3327),需要3.49秒。

要求:

我们有4个客户,我们每天计算客户销售用户的数据,并将其存储在数据库中。

表结构:

  • 主键:ClientId
  • 排序键:日期UserId
  • 其他属性:日期

在查询中-我们使用主键ClientId

目前,我们正在为DynamoDB使用按需模式,但我们感觉到响应时间

我们是否有任何方法可以使用任何AWS配置来改进这一点?

更新Lambda中的[24/03/2021]-我们正在使用NodeJs。

module.exports.executeQuery = async(dynamoDbClient, queryInput) => {
  return await new Promise((resolve, reject) => {
    dynamoDbClient.query(queryInput, (err, users) => {
      if (err) {
        reject(handleQueryError(err));
      }
      else {
        resolve({
          statusCode: 200,
          users,
        });
      }
    });
  });
};

为Lambda设置的内存=128 MB

共有2个答案

经慈
2023-03-14

正如评论中所建议的,我首先增加Lambda函数的内存大小。

Lambda CPU性能随内存而变化,根据我的经验,从DynamoDB解析更大的响应会从更高的CPU性能中受益匪浅。

几天前,我在一个博客上做了一个性能分析(免责声明:我的雇主techblog,这是关于主题的——尽管是针对python的),发现不同内存大小的性能之间存在显著差异。

丁和歌
2023-03-14

你会得到3327个结果,所以3.5秒的响应时间并不让我惊讶。从我的经验来看,听起来很对。

这里的根本问题是缺少线程或并行处理。您可以很容易地证明这一点,请运行以下CLI命令:

aws dynamodb scan --table-name YOURTABLENAME --total-segments X --segment 0 --select COUNT

替换YOURTABLENAMEX,其中X应该是表中数据的MB数。因此,如果您有100MB的数据,请使用100。

这将使用X个线程执行并行扫描。它将在大约1s后返回,并将获取您表中的所有项目。

然后,您可以尝试使用--total segments 1(使用一个线程运行)进行扫描,并查看需要多长时间。

这表明需要在并行线程中获取大量数据。

你的分区太大了。如果您尝试一个数据较少的键,可能会有10条记录,我希望查询速度会更快。

您可能需要研究分片技术来减少分区中的数据量,然后您可以并行查询这些分区。请注意,DynamoDB没有提供BatchQuery方法,这是一个耻辱,因此您必须编写自己的并行查询方法。

 类似资料:
  • 问题内容: 我有一个查询,使用带通配符的“ like”来搜索客户端。例如: 它还可以在“ where”子句中使用较少的参数,例如: 谁能说出优化这种查询性能的最佳方法是什么?也许我需要创建一个索引?该表在生产中最多可以有1000K条记录。 问题答案: 要在模式具有表单的位置上做很多事情,您需要查找SQL Server的全文本索引功能,并使用代替。照原样,您正在执行全表扫描,因为普通索引对搜索以通配

  • 问题内容: 我希望从我的用户模型中检索一些信息,如下所示: 在主页中,我有一个 位置 过滤器,您可以在其中浏览来自国家或城市的用户。 所有字段还包含其中的用户数: 在主页上,然后我还有“学生和老师”页面,我希望仅提供有关这些国家和城市有多少老师的信息… 我想做的是创建一个对MongoDB的查询,以通过单个查询检索所有这些信息。 此刻查询如下: 问题是我不知道如何获取所需的所有信息。 我不知道如何获

  • 问题内容: 此查询需要153秒才能运行。中有数百万行。 我认为查询要花很长时间,因为where子句中的功能。但是,我需要在列上执行ltrim rtrim,而且日期也必须在格式上匹配。如何优化此查询? 说明计划: 首要的关键: 索引: 但是,在解释计划中,我看不到使用索引/主键。那是问题吗? 问题答案: 试试这个: 如果尚无时间,请从其外观(出生日期?)上删除该对象。除此之外,您还需要一些索引工作。

  • 我正在使用DocumentClient进行查询。并将无服务器框架与DynamoDb结合使用。 我试图查询BEGINS_WITH不提供任何主键。 以下是我的数据: 这是我的无服务器。yml[我猜是表格配置]: 问:使用DocumentCareet,我想查询的前几个元素。这将返回所有文档,即匹配。就像在这种情况下,我想查询,它会返回 目前我的查询如下所示[这给出错误][在本地DynamoDB JS s

  • 问题内容: 这就是整个查询… 如果… 和… 有明显的理由吗? 正在服用? 扩展说明 问题答案: 您可以始终使用EXPLAIN或EXPLAIN EXTENDED 来查看MySql对查询所做的操作 您也可以用稍微不同的方式编写查询,是否尝试过以下方法? 看看效果如何会很有趣。我希望它会更快,因为目前,我认为MySql将为您拥有的每个节目运行内部查询1(这样一个查询将运行多次。联接应该更有效。) 如果希

  • 我有一个dynamodb表,它有一个分区键和排序键。我需要根据列查询表以查找最近的100行。当我检查API时,我必须指定。在这种情况下,我不想查询分区键。我该怎么做? 操作似乎不支持对结果进行排序。 我能想到的一个解决方案是在表中添加一个属性,比如说,并为表中的每一行指定相同的值。然后在表上创建一个GSI,分区键为,时间戳为排序键。然后我可以查询分区键等于的表,并根据对结果进行排序。然而,这个解决