Amazon DynamoDB 是一个完全托管的 NoSQL 数据库服务,提供高性能和可扩展性。它支持一些常见的查询功能,但也有一些限制。
在设计 DynamoDB 数据模型时,理解这些查询限制非常重要,可以帮助你设计适合的主键和索引,以便更高效地查询数据。
以下是 DynamoDB 支持和不支持的查询操作的概述:
一、支持的查询类型
1、按主键查询
DynamoDB 的查询操作最常见的用法是通过主键进行查询。每个表都有一个主键,可以是:
- 简单主键:由一个分区键组成。
- 复合主键:由分区键和排序键组成。
主键查询是最常见的查询方式,性能非常高。你可以使用 GetItem
或 Query
API 通过主键获取数据。
2、按分区键和排序键查询
使用 Query
API,可以按分区键精确匹配并可选择性地通过排序键进行过滤。支持常见的操作符如:
- 等于 (
=
) - 大于 (
>
) - 小于 (
<
) - 大于等于 (
>=
) - 小于等于 (
<=
) - BETWEEN(范围查询)
- IN(查询多个值)
排序键允许按特定的顺序返回匹配的数据。
3、按索引查询(Secondary Indexes)
DynamoDB 支持两种类型的二级索引,允许你使用非主键属性进行查询:
- 全局二级索引(GSI):可以在任何属性上创建索引,不限制于主键组成。
- 本地二级索引(LSI):必须与表的分区键相同,但可以为排序键创建不同的索引。
通过二级索引,你可以根据索引键进行查询,支持更多的查询条件和排序选项。
4、扫描查询
使用 Scan
操作可以扫描整个表或指定索引。Scan
会遍历表的所有项,并返回匹配的结果。尽管它比 Query
慢,但它提供了灵活性,可以用于查找表中所有项,或按照指定的过滤条件筛选数据。
5、过滤条件(Filter Expressions)
查询和扫描操作都支持通过过滤条件进一步限制返回的数据。例如,查询结果可以基于非主键属性进行过滤,虽然过滤条件应用在数据返回时,但会消耗额外的资源。
6、强一致性读取
通过设置 ConsistentRead
参数为 true
,你可以使用强一致性读取数据。默认情况下,DynamoDB 使用最终一致性读取。
二、不支持的查询类型
1、JOIN 操作
DynamoDB 不支持 SQL 风格的复杂查询语法,比如:
- 嵌套查询(Subqueries)
- 联接多个表(JOINs)
- 多表查询
2、聚合操作
DynamoDB 不支持像 SQL 中的 GROUP BY
、COUNT
、SUM
等聚合操作。
如果需要进行复杂的聚合,你必须在应用层或通过其他工具(如 AWS Lambda)来处理。
3、全表排序
DynamoDB 不支持在 Scan
或 Query
上进行全表级别的排序操作。你只能在基于主键或索引的查询中对结果进行排序(特别是基于排序键的查询)。
4、全文搜索
DynamoDB 本身不支持全文搜索查询。如果需要全文搜索功能,可以结合使用 Amazon Elasticsearch Service(现为 OpenSearch)来实现搜索功能。
5、复杂的条件查询
DynamoDB 查询条件受限于特定操作符,无法像 SQL 那样支持复杂的布尔逻辑运算。例如,AND
和 OR
操作仅限于某些操作符,且不能在查询条件中任意组合。
6、事务性查询的限制
DynamoDB 支持事务(使用 TransactWriteItems
和 TransactGetItems
),但它们的功能相对于传统数据库的事务仍然有限。事务操作有一定的并发限制,且事务内的查询与操作在性能上会有开销。