DynamoDB FAQ — 常见问题解答
开发者最常问的 DynamoDB 问题——每个都配有清晰、坦诚的解答和后续阅读指引。
DynamoDB 特性与能力
DynamoDB 是键值存储吗?
是——同时也是文档存储。每个项目都通过主键寻址,而属性可以按映射和列表嵌套最多 32 层。
DynamoDB 是关系型数据库吗?
不是——DynamoDB 是一个 NoSQL 键值与文档数据库,没有固定模式、没有外键、也没有连接。取而代之的是围绕访问模式做反范式化。
DynamoDB 符合 ACID 吗?
符合——DynamoDB 通过 TransactWriteItems 和 TransactGetItems 提供 ACID 事务,在每个区域内把最多 100 个动作合成一次全有或全无的操作。
DynamoDB 加密吗?
加密——所有 DynamoDB 数据默认都用 AWS KMS 密钥静态加密,而且无法关闭。传输中的数据由 HTTPS/TLS 保护。
DynamoDB 是最终一致性的吗?
默认是——DynamoDB 的读取是最终一致性的。你可以在表和 LSI 上选择强一致性读取;GSI 则始终是最终一致性的。
DynamoDB 免费吗?
部分免费——DynamoDB 有一个永久免费套餐:每月 25 GB 存储外加 25 个写入容量单元和 25 个读取容量单元。超出部分按请求和按 GB 计费。
DynamoDB 是内存数据库吗?
不是——DynamoDB 会把每一次写入持久化到跨三个可用区的持久存储上。DAX 则额外提供一层可选的内存缓存,带来微秒级读取。
DynamoDB 是 NoSQL 数据库吗?
是——DynamoDB 是一个全托管的 NoSQL 键值与文档存储,存放无模式的项目、横向扩展,而它的 PartiQL 解析器会拒绝 JOIN。
DynamoDB 是开源的吗?
不是——DynamoDB 是一项专有的、全托管的 AWS 服务。DynamoDB Local 是供开发使用的免费模拟器,但生产引擎无法自托管。
DynamoDB 是无模式的吗?
是——DynamoDB 是无模式的。只有主键在建表时定义;其他每个属性都是可选的,可以逐条自由变化。
DynamoDB 是无服务器的吗?
是——DynamoDB 是一个全托管的无服务器 NoSQL 数据库。没有服务器要预置或打补丁;容量自动伸缩,按使用付费。
DynamoDB 能存储什么
DynamoDB 能存 null 值吗?
可以——DynamoDB 有专门的 NULL 类型,并且允许非键属性使用空字符串和空的列表/映射。但空集合会被拒绝。
DynamoDB 能存数组吗?
可以——DynamoDB 用 List(L)类型存数组:有序、可混合类型,最多嵌套 32 层。一个 400 KB 的项目大约能放下 11,070 个 UUID 字符串。
DynamoDB 能存储 blob 吗?
能,但有限制——DynamoDB 把二进制大对象存在 Binary 属性里(以 base64 编码传输),上限是 400 KB。更大的 blob,AWS 建议放 Amazon S3。
DynamoDB 能存图片吗?
可以,但只能存小图——DynamoDB 把图片作为 base64 的 Binary 属性存储,受 400 KB 项目上限约束。更大的图片,AWS 推荐用 Amazon S3。
DynamoDB 能存储 JSON 吗?
能——DynamoDB 用它的文档类型来存 JSON:map(M)对应对象,list(L)对应数组,最多嵌套 32 层,并受每项 400 KB 的限制。
DynamoDB 能存多少数据?
DynamoDB 的表没有大小上限,可横向扩展。真正的限制是每个项目 400 KB,以及仅在有 LSI 时每个项目集合 10 GB。
DynamoDB 的最大项目大小是多少?
400 KB,也就是恰好 409,600 字节,属性名和值都要计入。DynamoDB 的项目大小上限无法提高,更大的对象请放到 S3。
DynamoDB 集成与访问
DynamoDB 能导出到 S3 吗?
能——内置的 S3 导出会把整表或增量快照写成 DynamoDB JSON 或 Amazon Ion。它需要开启 PITR,且不消耗读容量。
Power BI 能连接 DynamoDB 吗?
不能直连——Power BI 没有原生的 DynamoDB 连接器。可以通过 Amazon Athena 的 ODBC 连接器或 CData 之类的驱动中转,并算清每次刷新扫描了多少数据的费用。
可以在 AWS 之外使用 DynamoDB 吗?
可以——DynamoDB 通过 HTTPS 在任何地方都可访问。任何持有 AWS 凭证的应用都能从笔记本、服务器或另一朵云调用区域 endpoint。
DynamoDB 有触发器吗?
有。DynamoDB 的触发器是 Streams 加上 Lambda:Lambda 每秒轮询 stream 四次,在每次 item 变更时运行。没有 CREATE TRIGGER 语句。
DynamoDB 支持 GraphQL 吗?
支持,通过 AWS AppSync——一个把 DynamoDB 表当作数据源的托管 GraphQL 服务,由解析器把 GraphQL 操作映射成 DynamoDB 调用。
DynamoDB 操作与查询
DynamoDB 能自动扩缩吗?
能——DynamoDB 自动扩缩会把预置容量维持在 20–90% 的目标利用率,但当平均使用率低于 28.9% 时,按需模式更便宜。
可以在本地运行 DynamoDB 吗?
可以——DynamoDB Local 是一个免费的可下载版 DynamoDB,通过 Docker、Java 归档包或 Maven 在你的机器上运行,离线暴露同样的 API。
DynamoDB 有备份吗?
有——按需备份用于长期快照,时间点恢复(PITR)提供连续备份,可恢复到过去 35 天内的任意一秒。
DynamoDB 支持全文搜索吗?
不,原生不支持——DynamoDB 没有相关性排序、词干还原或模糊匹配。零 ETL 的 OpenSearch 集成才是 AWS 原生的答案。
DynamoDB 支持地理空间查询吗?
并非原生支持——DynamoDB 没有地理数据类型,也没有距离运算符。地理空间查找是用 geohash/S2 单元键按范围查询建模出来的。
DynamoDB 支持 JOIN 吗?
不支持——DynamoDB 没有 JOIN,PartiQL 更是直接拒绝两张表的 SELECT,所以你要做反范式化。DynoTable 的 SQL Workbench 在客户端跑真正的连接。
DynamoDB 支持 SQL 吗?
部分支持——PartiQL 覆盖 SELECT、INSERT、UPDATE 和 DELETE,但拒绝 JOIN、GROUP BY 和 COUNT。DynoTable 的 SQL Workbench 能在你的表上运行这些。
DynamoDB 支持事务吗?
支持——DynamoDB 事务把最多 100 个跨表动作合成一次全有或全无的操作,代价是普通写入两倍的容量单元。
DynamoDB 支持 TTL 吗?
支持——DynamoDB 支持 Time to Live。设置一个存放 Unix 纪元过期时间(秒)的 Number 属性,DynamoDB 就会自动删除过期项,且不收费。
DynamoDB 有多快?
很快——DynamoDB 在任意规模下都提供稳定的个位数毫秒延迟。内存缓存 DAX 能把最终一致性读取压到微秒级。
DynamoDB 里能有多少张表?
默认每个区域 2,500 张 DynamoDB 表,申请后可提到 10,000 张。表本身没有大小上限,但每张预置容量的表即使闲置每月也要 0.57 美元。
在 DynamoDB 里怎么统计项目数量?
在 Query 或 Scan 上用 Select: COUNT,再用 LastEvaluatedKey 翻页并把 Count 累加。计数消耗的读取容量和把项目返回一样多。
DynamoDB 架构与内部原理
DynamoDB 能当缓存用吗?
能——DynamoDB 快速的键式查找加上 TTL,让它成为一个持久化缓存。要微秒级读取,就在它前面加上 DAX,一个托管的内存写穿缓存。
DynamoDB 支持外键吗?
不支持——DynamoDB 没有外键、参照完整性或级联删除。删掉父项,子项照样留着。关系要由你自己建模。
DynamoDB 支持二级索引吗?
支持——DynamoDB 有全局二级索引(自己的键、最终一致性、默认每张表 20 个)和本地二级索引(强一致性)。
DynamoDB 是多区域的吗?
标准的 DynamoDB 表是单区域的。全局表在多个区域之间做多活复制,可用性最高 99.999%,并在每个区域分别计收存储费用。
什么时候不该用 DynamoDB?
分析型工作负载、访问模式未知、大量即席查询,以及依赖连接的规范化关系型模式,都别用 DynamoDB。