DynamoDB 能存多少数据?
实际上没有上限。DynamoDB 的表没有最大容量,可以横向扩展到任意数量的项和字节。真正的限制是每个项(400 KB),以及仅在表带有本地二级索引时,每个项集合(同一个分区键值)10 GB。没有 LSI 的表不受分区大小限制。
表的大小:没有上限
DynamoDB 会随着数据增长自动把它铺到许多物理分区上。没有可配置的最大表大小——容量和存储会随着你写入而扩展。
确实存在的那些上限
- 400 KB——单个项的最大大小,按二进制单位计量,属性名和值都算在内(这个边界具体落在哪里)。
- 10 GB——仅当表带有本地二级索引(LSI)时,一个项集合(共享同一个分区键值的所有项)才有这个最大大小。没有 LSI 时,这个上限不生效。
你能测量的大小不是你付钱的大小
回答"我到底存了多少"最直接的办法是 DescribeTable,它会返回 TableSizeBytes。那个数字按设计就小于你的账单。AWS 的计费指南写道:"DynamoDB measures the size of your billable data by adding the raw byte size of your data plus a per-item storage overhead that depends on the features you have enabled",以及 "Storage usage values in the CUR will be higher compared with the storage values when using DescribeTable, because DescribeTable does not include the per-item storage overhead."
引擎报告的结果与此一致。一张装了 40 个约 3 KB 项的表返回的是 TableSizeBytes: 120700,那就是原始内容,别的什么都没有。那份开销从 API 上看不见,只会出现在成本与使用情况报告里。
所以两者之间的差距是随项的数量增长的,不是随项的大小。一千万个小项要为那份开销付一千万次;同样的字节塞进十万个更大的项,就只付十万次。如果你的账单跑在 TableSizeBytes 所暗示的前面,通常的原因就是一张由小行组成的宽表。
"没有上限"要花多少钱
存储是宽容的那一半。us-east-1 里一张 1 TB 的表是 1,024 GB,按每 GB-月 $0.25 算是每月 $256,用上 25 GB 的免费额度之后是 $249.75。
项大小才是不宽容的那一半,因为写入是按每 1 KB 向上取整的。按按需写请求单元每百万 $0.625 计算,同样是一百万个项,写入成本天差地别:
| 项大小 | 每个的写单元 | 100 万次写入(us-east-1,按需) |
|---|---|---|
| 1 KB | 1 | $0.63 |
| 100 KB | 100 | $62.50 |
| 400 KB | 400 | $250.00 |
所以你要围着设计的量不是表的大小,而是项的大小。把大 blob 推到 S3、在 DynamoDB 里只留指针,并且避免在一个热键之下出现无界的项集合。用定价计算器核对你自己的数字。
深入了解
阅读 DynamoDB 项集合和 DynamoDB 分区键是怎么工作的。下载 DynoTable 来高效地探索大表。
参考资料
- Quotas in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Local secondary indexes — Amazon DynamoDB Developer Guide
- TableDescription — Amazon DynamoDB API Reference
- Best practices for understanding your AWS billing and usage reports in DynamoDB — Amazon DynamoDB Developer Guide
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档;配额与价格于 2026-07-28 重新核对。
那个 TableSizeBytes 数字是 2026-07-28 通过 @aws-sdk/client-dynamodb 3.1095.0 针对 DynamoDB Local 3.3.0(amazon/dynamodb-local:latest)测量的。DynamoDB Local 不是线上服务,我们也没有据此推断任何逐项开销常数。