- DynamoDB 教程
- DynamoDB - 主页
- DynamoDB - 概述
- DynamoDB - 基本概念
- DynamoDB - 环境
- DynamoDB - 操作工具
- DynamoDB - 数据类型
- DynamoDB - 创建表
- DynamoDB - 加载表
- DynamoDB - 查询表
- DynamoDB - 删除表
- DynamoDB - API 接口
- DynamoDB - 创建项目
- DynamoDB - 获取项目
- DynamoDB - 更新项目
- DynamoDB - 删除项目
- DynamoDB - 批量写入
- DynamoDB - 批量检索
- DynamoDB - 查询
- DynamoDB - 扫描
- DynamoDB - 索引
- 全球二级指数
- 本地二级索引
- DynamoDB - 聚合
- DynamoDB - 访问控制
- DynamoDB - 权限 API
- DynamoDB - 条件
- 网络身份联合
- DynamoDB - 数据管道
- DynamoDB - 数据备份
- DynamoDB - 监控
- DynamoDB - CloudTrail
- DynamoDB-MapReduce
- DynamoDB - 表活动
- DynamoDB - 错误处理
- DynamoDB - 最佳实践
- DynamoDB 有用资源
- DynamoDB - 快速指南
- DynamoDB - 有用的资源
- DynamoDB - 讨论
DynamoDB - 扫描
扫描操作读取所有表项或二级索引。其默认功能会返回索引或表中所有项目的所有数据属性。在过滤属性中使用ProjectionExpression参数。
每次扫描都会返回一个结果集,即使没有找到匹配项,也会产生一个空集。扫描检索不超过 1MB,并可选择过滤数据。
注意- 扫描的参数和过滤也适用于查询。
扫描操作的类型
过滤- 扫描操作通过过滤表达式提供精细过滤,过滤表达式在扫描或查询后修改数据;返回结果之前。表达式使用比较运算符。它们的语法类似于条件表达式,但关键属性除外,这是过滤器表达式不允许的。您不能在筛选表达式中使用分区或排序键。
注- 1MB 限制适用于任何过滤应用之前。
吞吐量规范- 扫描消耗吞吐量,但是,消耗侧重于项目大小而不是返回的数据。无论您请求每个属性还是仅请求几个属性,消耗都保持不变,并且使用或不使用过滤表达式也不会影响消耗。
分页- DynamoDB 对结果进行分页,导致结果划分为特定页面。1MB 限制适用于返回的结果,当超过该限制时,需要再次扫描来收集其余数据。LastEvaluatedKey值允许您执行此后续扫描。只需将该值应用于ExclusiveStartkey即可。当LastEvaluatedKey值变为null时,操作已完成所有数据页。但是,非空值并不自动意味着保留更多数据。只有空值表示状态。
限制参数- 限制参数管理结果大小。DynamoDB 使用它来确定返回数据之前要处理的项目数量,并且不会在范围之外工作。如果您设置 x 值,DynamoDB 将返回前 x 个匹配项目。
LastEvaluatedKey 值也适用于限制参数产生部分结果的情况。用它来完成扫描。
结果计数- 对查询和扫描的响应还包括与ScannedCount和 Count相关的信息,它们量化扫描/查询的项目并量化返回的项目。如果不过滤,它们的值是相同的。当超过 1MB 时,计数仅代表已处理的部分。
一致性- 查询结果和扫描结果最终是一致的读取,但是,您也可以设置强一致的读取。使用ConstantRead参数更改此设置。
注意- 当设置为强一致时,一致的读取设置会使用双倍的容量单位来影响消耗。
性能- 由于扫描爬行整个表或二级索引,查询提供比扫描更好的性能,导致响应缓慢和吞吐量消耗大。扫描最适合小型表和使用较少过滤器的搜索,但是,您可以通过遵循一些最佳实践(例如避免突然的加速读取活动和利用并行扫描)来设计精益扫描。
查询会查找满足给定条件的特定范围的键,其性能取决于检索的数据量而不是键的数量。操作参数和匹配数量特别影响性能。
并行扫描
扫描操作默认按顺序执行处理。然后,它们以 1MB 为单位返回数据,这会提示应用程序获取下一部分。这会导致对大型表和索引进行长时间扫描。
这一特性还意味着扫描可能并不总是充分利用可用的吞吐量。DynamoDB 将表数据分布在多个分区上;由于其单分区操作,扫描吞吐量仍然仅限于单个分区。
该问题的解决方案是将表或索引逻辑地划分为段。然后“工人”并行(同时)扫描段。它使用Segment和TotalSegments参数来指定某些worker扫描的Segment并指定处理的Segment总数。
工人编号
您必须尝试工作线程值(Segment 参数)才能实现最佳应用程序性能。
注意- 大量工作人员的并行扫描可能会消耗所有吞吐量,从而影响吞吐量。使用 Limit 参数来管理此问题,您可以使用该参数来阻止单个工作线程消耗所有吞吐量。
以下是深度扫描示例。
注意- 以下程序可能假定先前创建的数据源。在尝试执行之前,获取支持库并创建必要的数据源(具有所需特征的表或其他引用源)。
此示例还使用 Eclipse IDE、AWS 凭证文件以及 Eclipse AWS Java 项目中的 AWS Toolkit。
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.Item; import com.amazonaws.services.dynamodbv2.document.ItemCollection; import com.amazonaws.services.dynamodbv2.document.ScanOutcome; import com.amazonaws.services.dynamodbv2.document.Table; public class ScanOpSample { static DynamoDB dynamoDB = new DynamoDB( new AmazonDynamoDBClient(new ProfileCredentialsProvider())); static String tableName = "ProductList"; public static void main(String[] args) throws Exception { findProductsUnderOneHun(); //finds products under 100 dollars } private static void findProductsUnderOneHun() { Table table = dynamoDB.getTable(tableName); Map<String, Object> expressionAttributeValues = new HashMap<String, Object>(); expressionAttributeValues.put(":pr", 100); ItemCollection<ScanOutcome> items = table.scan ( "Price < :pr", //FilterExpression "ID, Nomenclature, ProductCategory, Price", //ProjectionExpression null, //No ExpressionAttributeNames expressionAttributeValues); System.out.println("Scanned " + tableName + " to find items under $100."); Iterator<Item> iterator = items.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next().toJSONPretty()); } } }