使用比较运算符查询与dynamodb限制时的性能问题

时间:2014-04-21 09:39:56

标签: database performance amazon-dynamodb

我正在查询一个包含hash和range键的表。在查询时,我对其进行了限制,但limit仅限制返回项目的数量。据我所知,使用比较运算符(如range_key__lt=12345)扫描所有项目,然后扫描给定范围键,并返回由limit参数指定的前n项。在这种情况下,我遇到查询性能问题,我不希望它扫描所有小于范围键的项目。范围键上是否存在索引?它似乎检索桶上的所有项目属于哈希键。然后扫描小于或大于某个值的所有项目并返回其中的一些项目。我不明白过滤器/搜索机制如何对范围键起作用。

我的问题不清楚吗?我认为这是与数据库或dynamodb具体相关的基本问题。我将尝试详细解释它。当我们尝试从数据库中检索项目时,如果没有在特定列上创建的索引,它会扫描所有行并比较它是否满足给定条件。但是,如果此列上存在索引,如B+ Tree,则检索项目的速度会快得多,因为它会从索引表中找到该行的直接地址。现在的问题是,我在dynamodb上有一个表格,其中hash key(类型无关紧要)和range key是数字类型。我的范围键实际上是时间戳,我将查询该行具有与当前时间最接近的时间戳(日期)。我在这里查询。 r = test_table.query(hashkey__eq="abc", date__lt=1398099600, limit=1)。在我的表中,近1000个项目具有“abc”哈希键。所以我首先使用此查询进行此操作,并对这1000个项目进行范围键搜索。我有近990项时间戳值低于1398099600的项目。我的查询语句使用python模块在​​boto中编写。但是,它运作缓慢。我也在aws console上进行相同的查询并花了很多时间(aws控制台上没有限制条件,所以它通常检索低于给定时间戳的所有项目)。因此,我使用python中的DEBUG模块以logging模式打开日志文件。在这种模式下,我可以看到dynamodb服务器扫描了多少行来获得结果。然后我看到它扫描所有项目的时间戳低于dynamodb server上给定的时间戳。 limit=1仅限制将返回到远程客户端的行数,也就是说,它仅将第一行扫描行发送到客户端。由于它扫描了许多行,因此也会出现throughput provision错误。

注意:相反使用less than,如果我使用between比较器查询运行得更快。因此,我可以使用datetime和avarage下限来解决这个问题,并在运算符之间使用查询。但我不知道这是正确的解决方案。

问题是,有没有办法以更有效的方式检索具有最近日期的项目,而是检索少于项目的所有项目?

0 个答案:

没有答案