📅  最后修改于: 2023-12-03 15:30:35.020000             🧑  作者: Mango
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}'
在上面的示例中,已使用局部二级索引创建了两个新索引:MusicsByArtistAndAlbum
和 MusicsByArtistAndPrice
。这些索引将表 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
匹配的项。