📜  DynamoDB-索引(1)

📅  最后修改于: 2023-12-03 15:30:35.020000             🧑  作者: Mango

DynamoDB 索引

介绍

Amazon DynamoDB 是一种 NoSQL 数据库,它使用无服务器体系结构的方式运行,支持快速、灵活的数据存储和查询。DynamoDB 索引是 DynamoDB 数据模型的一种核心组成部分。它们提供了一种有效的方式来查询和访问表中的数据。

DynamoDB 的主索引是每个表的必需索引,该索引基于表的主键构建。但有些情况下,使用主键访问数据时可能会很慢或不切实际,这是 DynamoDB 索引变得有用的时刻。DynamoDB 支持两种类型的索引:局部二级索引和全局二级索引。

局部二级索引

局部二级索引是按照用户指定的非主键属性建立的索引。它仅对某些属性值进行分区,因此查询只对这些分区进行搜索。这样可以带来以下好处:

  • 更快的查询速度,因为查询仅在分区内搜索。
  • 可以使用非主键属性过滤查询结果。
  • 功能可扩展性,因为可以添加和删除局部二级索引而无需更改表结构。

局部二级索引使用与表相同的分区键,但指定了另一个属性作为索引键。局部二级索引可以有多个,但每个属性只能用于一个局部二级索引。

局部二级索引只能查询与索引键匹配的属性值。这意味着局部二级索引不支持全表扫描,因此必须指定某个或某些分区值进行搜索。

局部二级索引示例:

aws dynamodb create-table \
   --table-name Music \
   --attribute-definitions AttributeName=Artist,AttributeType=S AttributeName=SongTitle,AttributeType=S AttributeName=AlbumTitle,AttributeType=S AttributeName=Price,AttributeType=S \
   --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
   --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
   --local-secondary-indexes 'IndexName=MusicsByArtistAndAlbum,KeySchema=[{AttributeName=Artist,KeyType=HASH},{AttributeName=AlbumTitle,KeyType=RANGE}],Projection={ProjectionType=ALL}' \
   --local-secondary-indexes 'IndexName=MusicsByArtistAndPrice,KeySchema=[{AttributeName=Artist,KeyType=HASH},{AttributeName=Price,KeyType=RANGE}],Projection={ProjectionType=ALL}'

在上面的示例中,已使用局部二级索引创建了两个新索引:MusicsByArtistAndAlbumMusicsByArtistAndPrice。这些索引将表 Music 中的属性 Artist 组合为主分区键,并将不同的属性用作索引键。

局部二级索引查询

要在局部二级索引中检索数据,需要使用 Query 操作。可以使用 KeyConditionExpression 表达式指定要检索的值。如果使用 SortKey,则可以使用 Between 和 ComparisonOperator 操作符。

查询示例:

aws dynamodb query --table-name Music --index-name MusicsByArtistAndAlbum --key-condition-expression "#artist = :artist" --expression-attribute-names "#artist=Artist" --expression-attribute-values '{":artist":{"S":"ACME Band"}}' --region us-west-2

上面的示例查询了索引 MusicsByArtistAndAlbum 中的所有与 Artist 属性值为 ACME Band 匹配的项。

全局二级索引

全局二级索引作为独立于表的全局索引存在。它们与表的主键无关,但可以包含一个或多个自定义索引键。全局二级索引可用于所有查询,不仅限于主键查询。这使得可以轻松注释其他查询,并更容易扩展现有数据模型。

全局二级索引是为了满足以下目标而创建的:

  • 以非主键属性速度更快地查询数据。
  • 在不同类型的属性值之间进行分区。
  • 使用针对有序分区起作用的选择器。
  • 创建多个不同的查询路径以优化不同的工作负载。

全局二级索引示例:

aws dynamodb create-table \
   --table-name Orders \
   --attribute-definitions AttributeName=CustomerId,AttributeType=S AttributeName=OrderDate,AttributeType=S AttributeName=OrderStatus,AttributeType=S \
   --key-schema AttributeName=CustomerId,KeyType=HASH AttributeName=OrderDate,KeyType=RANGE \
   --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
   --global-secondardy-indexes 'IndexName=OrdersByStatus,KeySchema=[{AttributeName=OrderStatus,KeyType=HASH}],Projection={ProjectionType=ALL}'

在上面的示例中,已使用全局二级索引创建了一个新的索引:OrdersByStatus。此索引对 OrderStatus 属性进行分区,并为查询提供了快速访问,而不必在整个表中搜索。

全局二级索引查询

可以使用 Query 或 Scan 操作查询全局二级索引,其中 Scan 操作更适合在未使用主键的情况下查询表。要在全局二级索引中查询数据,请使用 KeyConditionExpression 表达式。使用 ShowKeyExpression 表达式可以指定要返回的属性。

查询示例:

aws dynamodb query --table-name Orders --index-name OrdersByStatus --key-condition-expression "#status = :status" --expression-attribute-names "#status=OrderStatus" --expression-attribute-values '{":status":{"S":"Pending"}}' --region us-west-2

上面的示例查询了索引 OrdersByStatus 中的所有与 OrderStatus 属性值为 Pending 匹配的项。