使用索引查询DynamoDB行数:ScannedCount是否为全表扫描?
DynamoDB Query使用索引时ScannedCount是否代表全表扫描?
不会,你这个操作不是全表扫描,完全不用担心3亿行表带来的高额成本,原因如下:
- 你调用的是
query接口,并且指定了IndexName和精准的KeyConditionExpression,DynamoDB会直接定位到索引parentid-index中parentid等于指定值的分区,只扫描该分区内的条目,不会遍历整个表或者整个索引的所有分区。 ScannedCount在这里的含义是:为了找到匹配条件的条目,在目标索引分区中扫描过的项目数。如果你的索引设计合理(parentid作为索引分区键),这个数值只会和该parentid对应的条目数量相关,和全表3亿+行没有关系。- 只有
scan操作才会触发全表/全索引扫描,query是基于键的精准查询,属于DynamoDB中成本可控的高效操作。
如果想要更直观地确认消耗的资源,可以在query的参数里加上ReturnConsumedCapacity: "TOTAL",这样返回结果里会包含实际消耗的读写容量单位(RCU/WCU),能更清楚看到操作的成本。
你的代码示例:
import {DynamoDBClient} from "@aws-sdk/client-dynamodb"; import {DynamoDBDocument} from "@aws-sdk/lib-dynamodb"; async function query() { const dynamodDBConnection = new DynamoDBClient({region: "us-east-1"}); const documentClient = DynamoDBDocument.from(dynamodDBConnection); const output = await documentClient.query( { TableName: "table7", IndexName: "parentid-index", KeyConditionExpression: 'parentid = :parentid', ExpressionAttributeValues: { ':parentid': "5ceb26579086c94159bf145d8933acb2"}, // 可选:添加该行查看消耗的容量 // ReturnConsumedCapacity: "TOTAL" } ); console.log(output.ScannedCount) } (async function() { await query(); })();
内容的提问来源于stack exchange,提问作者Sunil
相关产品推荐
相关产品推荐

