如何在Golang中获取DynamoDB项目汇总的条目数(非Scan方式)
获取DynamoDB表的汇总指标(每6小时更新)
要获取DynamoDB表的条目数、表大小及平均条目大小这些每6小时更新的汇总指标,无需使用Scan操作,直接调用DescribeTable API即可。该API返回的表元数据中包含这些预计算的聚合值,不仅效率更高,还不会消耗表的读取容量。
实现代码
首先定义一个结构体来封装所有需要的汇总指标:
type TableSummary struct { ItemCount *int64 // 条目数 TableSizeBytes *int64 // 表总大小(字节) AverageItemSize float64 // 平均条目大小(字节) }
然后实现获取汇总指标的函数:
import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/dynamodb" ) func GetTableSummary(tableName string) (*TableSummary, error) { dynamodbClient := createDynamoDBClient() // 调用DescribeTable API descResp, err := dynamodbClient.DescribeTable(&dynamodb.DescribeTableInput{ TableName: aws.String(tableName), }) if err != nil { return nil, err } tableDesc := descResp.Table summary := &TableSummary{ ItemCount: tableDesc.ItemCount, TableSizeBytes: tableDesc.TableSizeBytes, } // 计算平均条目大小(避免除以0) if tableDesc.ItemCount != nil && *tableDesc.ItemCount > 0 && tableDesc.TableSizeBytes != nil { summary.AverageItemSize = float64(*tableDesc.TableSizeBytes) / float64(*tableDesc.ItemCount) } else { summary.AverageItemSize = 0.0 } return summary, nil }
使用示例
summary, err := GetTableSummary("your-table-name") if err != nil { // 处理错误逻辑 panic(err) } if summary.ItemCount != nil { println("条目数:", *summary.ItemCount) } println("表大小(字节):", *summary.TableSizeBytes) println("平均条目大小(字节):", summary.AverageItemSize)
关键说明
- DescribeTable API返回的
ItemCount和TableSizeBytes是DynamoDB每6小时更新一次的聚合值,并非实时数据 - 该操作属于DynamoDB的控制平面操作,不会消耗表的读写容量单位(RCU/WCU)
- 相比Scan操作,此方法性能更优,尤其适用于大表场景
内容的提问来源于stack exchange,提问作者Nicholas Davis
相关产品推荐
相关产品推荐

