.net - DynamoDb 大表查询速度
问题描述
我们正在从 mysql 迁移到 dynamo db 在此之前我有一些问题
我的 mysql 表上有 4000 万个项目
有一个开始,我将 225,000 移到 dynamo db 的一张桌子上,以测试它是否值得
我的对象看起来像这样:
"Partition key"{
account_id:number,
book_id:1,
reader_id:2,
field:3,
field:4,
...
}
我的第一个测试是通过 account_id 获取数据
所以我为这个字段创建了一个全局索引
我尝试了什么:
使用正确的索引查询account_id = 2 的所有数据
花了大约 90 秒,返回了 225,000 件商品
这是 dynamo db 的正常速度吗?
现在可以说我不需要返回实际的对象我只需要计算有多少对象
火柴:
account_id=3
AND book_id=10
和 reader_id=222
我知道我需要为此扫描表格
什么是最好的方法,我可以期待这种扫描的“正常”速度吗
一张桌子有 4000 万件物品?
非常感谢
解决方案
Dynamodb 扫描很昂贵,几乎不应该使用,但如果您的要求是这样的,您可以采取以下方法,
维护两张表,一张是您已经创建的,另一张是您存储计算值的,
您可以使用 dynamodb 流、lambda 函数在第二个表中填充数据,这将确保
- 第一个表中操作的原子性和
- 当您在 lambda 中将并发设置为较小的数字时,它将解决第二个表中的竞争条件。
现在,每当您想要计算数据时,您都可以转到第二个表并获取数据。它将确保您不必进行扫描。
该方法的优点
- 不必进行扫描。
缺点
- 将不得不维护2张桌子。
- 如果需求发生变化,我们可能必须重新填充第二个表,这将是一项重大的工作。(PS 如果您使用 lambda 和 dynamo,它可以变得更容易,首先清理第二个表。现在您只需更改第一个表中的一些随机字段项目,它将通过管道,填充第二个表。)
- 数据可用性延迟。(因为数据填充是异步的)
在上面建议的方法中,如果您仅在第一个表中使用特殊的辅助键作为计算值,则可以放弃 2 个表。但它会出现类似的问题
您的表模式可能会演变,计算值可能没有这些值。(比如定义一个新的辅助键?)(因此建议有 2 个表)
竞争条件将出现在两个请求同时尝试更新相同记录的情况下。(因此 lambda 函数的并发性较低,因此 2 个线程不能在同一记录上工作。)
原子性:如果第二次写入失败,我们可能必须恢复第一次放置。
推荐阅读
- php - 在检查是否从地址连接以下地址失败时捕获 EOF(PHP 邮件程序)
- kubernetes - 使用 telegraf 作为 daemonset 发送 kubernetes pod/containers 的指标
- android - Google Play Vitals 上出现奇怪的兼容性警告
- ios - TPPDF (iOS) - 页脚部分的图像显示超出页面边界
- python - 如何让python脚本永远在线运行?
- asp.net - 在页面模型中使用剃须刀页面注释
- kubernetes - 每日文件放入 Kubernetes
- django - 如何在管理页面上使用 RadioSelect 在 Wagtail 中创建 ManyToOne?
- ruby - 需要帮助处理 Savon 中的 Timeout::Error
- react-native - 反应导航 - TabNavigator-> StackNavigator 中标题菜单图标的 DrawerNavigator