Amazon DynamoDB按非哈希键user_id查询:无需全表扫描获取记录的方法
DynamoDB 指定user_id等值查询优化方案
你当前使用全表Scan再遍历过滤的方案效率极低,数据量增长后会出现延迟高、读容量成本超支的问题,可通过DynamoDB原生的Query接口实现目标查询,完全避免全表扫描,具体操作如下:
- 场景1:需要匹配的
parts.createdBy(即业务场景的user_id)是表的主分区键
直接调用Query接口传入分区键等值条件即可,参考实现代码:const params = { TableName: '替换为你的表名', KeyConditionExpression: '#parts.#createdBy = :userId', ExpressionAttributeNames: { '#parts': 'parts', '#createdBy': 'createdBy' }, ExpressionAttributeValues: { ':userId': '1' }, ProjectionExpression: 'parts' // 仅返回需要的parts字段,进一步降低IO开销 } const data = await db.query(params).promise() const arr = data.Items.map(item => item.parts) - 场景2:
parts.createdBy不是表的主分区键
先给表创建全局二级索引(GSI),将parts.createdBy设置为该GSI的分区键,索引创建完成后对GSI发起Query请求即可,参考实现代码:const params = { TableName: '替换为你的表名', IndexName: '替换为你创建的GSI名称', KeyConditionExpression: '#parts.#createdBy = :userId', ExpressionAttributeNames: { '#parts': 'parts', '#createdBy': 'createdBy' }, ExpressionAttributeValues: { ':userId': '1' }, ProjectionExpression: 'parts' } const data = await db.query(params).promise() const arr = data.Items.map(item => item.parts)
优化后查询的时间复杂度从全表扫描的O(n)降至O(log n),读容量消耗、查询延迟都会大幅降低,是DynamoDB等值查询的标准实现方案。
内容的提问来源于stack exchange,提问作者Xamarin Dev
相关产品推荐
相关产品推荐

