如何解决DynamoDB 表中排序/范围键的数据类型和查询性能
我正在 DynamoDB 中保存 IoT 时间序列数据。 此外,数据需要按小时汇总,因此有两个表,一个用于 RealtimeData,另一个用于 HourlyData。
[Ck:复合键]
RealtimeDate 表的 dynamodb 方案是, Ck(字符串)和时间戳(数字)作为排序键
而 HourlyDate 表的方案是, ck (string) 和 tsKey (string yyyy-mm-dd:hh) 作为排序键
例如,在 RealtimeData 表中,数据存储为: ck:a8f03ddc-a741-4e86-926a-45d9f9e5e9f7 (guid) & Sort key (timeStamp): 1621485057
在 HourlyData 表中,数据存储为: ck:a8f03ddc-a741-4e86-926a-45d9f9e5e9f7 (guid) & 排序键 (tsKey): 2021-05-20:10
小时表中的排序键可能是 yyyymmddhh(数字类型)而不是格式为 yyyy-mm-dd:hh 的字符串类型,但表已经创建,数据已经保存了一段时间。
如果排序键是 yyyymmddhh 格式(数字 类型),它可能是: ck:a8f03ddc-a741-4e86-926a-45d9f9e5e9f7 (guid) & 排序键 (tsKey): 2021052010
我想要小时数作为排序键的一部分的原因是因为只要接收到的数据是同一小时的,行就会被更新。
接下来,查询 HourlyData 表的日期/时间范围:
sd = event.startDate; // epoc time
ed = event.endDate;
tsKey = moment(sd).subtract({hours:1}).format("YYYY-MM-DD:HH"); // hour before startDateTime
:
.
:
TableName: `HourlyData`,// KeyConditionExpression: "compositeKey =:ck",KeyConditionExpression: "compositeKey =:ck and tsKey > :tsKey",FilterExpression: "#timeStamp BETWEEN :startDate and :endDate",ExpressionAttributeNames: {"#timeStamp": "timeStamp"}
ExpressionAttributeValues: {
":ck": compositeKey,":tsKey": tsKey,":endDate": ed,":startDate": sd
}
即,获取大于 sd 中小时数的每小时数据,并通过 sd 和 ed 之间的时间戳过滤结果集。
问题是:
是否存在由于使用 string 类型 (yyyy-mm-dd:hh) 而不是 number 类型作为排序键的(查询)性能问题( yyyymmddhh) 在 HourlyData 表中?
我知道消耗的 RCU 将基于查询返回的结果集而不是过滤后的结果集;因此使用排序键来提高性能并且成本更低。 (即,如果 KeyConditionExpression 中没有排序键,性能会下降 - 上面注释的代码)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。