java - Amazon DynamoDB 中的 MAX 操作

标签 java database performance nosql amazon-dynamodb

我刚开始使用 NoSQL 数据库。我在 DynamoDB 中有一个表,其中包含超过 100k 个项目。此外,此表会经常刷新。在这张表上,我希望能够在关系数据库世界中做类似的事情:

Select * 
from tableName 
where attributeName = (Select MAX(attributeName) from tableName);

有没有什么便宜的方法可以做到这一点而不必将所有行提取到我的 Java 代码中?任何输入/指针将不胜感激。谢谢。

最佳答案

在不增加空间或复杂性的情况下,没有便宜的方法可以做到这一点。

昂贵的方法是扫描整个表,仅检索关键属性和 attributeName 属性,计算最大值,然后获取您找到的所有(完整)项目最大。

如果您有一个复合键(散列和范围)和几个散列键相对于表中的总项目,Local secondary indexes会有所帮助,而且只需要一点点空间。您可以在 attributeName 属性上有一个索引,然后使用该索引查询每个散列键,并使用“isScanIndexForward:false”和“limit:1”从该 hashKey 中获取“max” .然后计算所有结果的最大值(每个哈希键有 1 个结果),并且您知道要检索的值。您可以用几乎相同的方式检索它们,在 attributeName 上使用向后扫描和“EQ”条件。

如果您愿意增加复杂性,您可以将此信息存储在一个额外的表中。像 tableName.extraInfo 这样的东西,它有一个像这样的项目:{hashKey: "maxOfAttributeName", "value":5}。然后,当您 putupdate 主表时,您也更新了这个字段,瞧,您有了您的值。如果您的数据变化很快,请注意这种方法带来的事务复杂性。

关于java - Amazon DynamoDB 中的 MAX 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18219562/

相关文章:

c# - 适用于字节数组的哈希码方法?

python - 加速嵌套 python 数组的操作

python - 计算平方欧氏距离的可能优化

java - 线程上下文中的 String 对象和 StringBuffer 对象有什么区别?

java - 尝试获得“是//否”提示来工作。不会接受回应

sql - 如何在 PostgreSQL 中获取字符串中正则表达式匹配的位置?

mysql - 结合图形数据库和 RDBMS

java - ByteBuffer翻转方法的目的是什么? (为什么它被称为 "flip"?)

java - 尝试通过 Eclipse 连接到 Sql 服务器(找不到驱动程序..我认为)

database - 始终保持数据库连接打开可以吗?