摘要:上一節我們介紹了項目的添加修改獲取刪除操作,這一節將介紹索引的創建及管理。創建索引在關系數據庫中,索引是一個數據結構,可對表中的不同的列執行快速查詢。但是,全局二級索引僅支持最終一致性。無論使用的是關系數據庫還是,在創建索引時都應謹慎。
創建索引上一節我們介紹了項目的添加、修改、獲取、刪除(CRUD)操作,這一節將介紹索引的創建及管理。
在關系數據庫中,索引是一個數據結構,可對表中的不同的列執行快速查詢。可以使用 CREATE INDEX SQL 語句將索引添加到現有表,并指定要建立索引的列。在創建索引后,可以照常查詢表中的數據,但現在數據庫可使用索引快速查找表中的指定行,而不是掃描整個表。
在創建一個索引后,數據庫將自動維護此索引。只要修改表中的數據,就會自動更改索引以反映表中的更改。
在 MySQL 中,您可以創建如下所示的索引:
CREATE INDEX GenreAndPriceIndex ON Music (genre, price);
在 DynamoDB 中,我們可以創建和使用secondary index來實現類似目的。
DynamoDB 中的索引與其關系對應項不同。當我們創建secondary index時,必須指定其鍵屬性 - 分區鍵和排序鍵。
在創建secondary index后,我們可以對它執行 Query 或 Scan 操作,就如同對表執行這些操作一樣。
DynamoDB 沒有查詢優化程序,因此,僅在我們對secondary index執行 Query 或 Scan 操作時使用它。
DynamoDB 支持兩種不同的索引:
全局二級索引 - 索引的主鍵可以是其表中的任意兩個屬性(可以在創建表時創建,也可以向現有表添加新全局二級索引,或者刪除現有的全局二級索引)。
本地二級索引 - 索引的分區鍵必須與其表的分區鍵相同。不過,排序鍵可以是任何其他屬性(是在創建表的同時創建的。不能向現有表添加本地二級索引,也不能刪除已存在的任何本地二級索引)。
DynamoDB 確保secondary index中的數據最終與其表保持一致。我們可以請求對表或local secondary index執行強一致性 Query 或 Scan 操作。但是,全局二級索引僅支持最終一致性。
可使用 UpdateTable 操作并指定 GlobalSecondaryIndexUpdates 來將global secondary index添加到現有表:
{ TableName: "Music", AttributeDefinitions:[ {AttributeName: "Genre", AttributeType: "S"}, {AttributeName: "Price", AttributeType: "N"} ], GlobalSecondaryIndexUpdates: [ { Create: { IndexName: "GenreAndPriceIndex", KeySchema: [ {AttributeName: "Genre", KeyType: "HASH"}, //Partition key {AttributeName: "Price", KeyType: "RANGE"}, //Sort key ], Projection: { "ProjectionType": "ALL" }, ProvisionedThroughput: { "ReadCapacityUnits": 1,"WriteCapacityUnits": 1 } } } ] }
添加索引時必須向 UpdateTable 提供以下參數:
TableName – 索引將關聯到的表。
AttributeDefinitions – 索引的鍵架構屬性的數據類型。
GlobalSecondaryIndexUpdates – 有關要創建的索引的詳細信息:
IndexName - 索引的名稱。
KeySchema – 用于索引主鍵的屬性。
Projection - 表中要復制到索引的屬性。在此情況下,ALL 意味著復制所有屬性。
ProvisionedThroughput – 每秒需對此索引執行的讀取和寫入次數。(它與表的預配置吞吐量設置是分開的。)
在此操作中,會將表中的數據回填到新索引。在回填期間,表保持可用。但索引未準備就緒,直至其 Backfilling 屬性從 true 變為 false。您可以使用 DescribeTable 操作查看此屬性。
python 示例boto3
import boto3 db3 = boto3.resource("dynamodb", endpoint_url="http://localhost:8000", region_name="us-west-2") table = db3.meta.client.update_table( TableName="Music", AttributeDefinitions=[ { "AttributeName": "Genre", "AttributeType": "S" }, { "AttributeName": "Price", "AttributeType": "N" } ], GlobalSecondaryIndexUpdates=[ { "Create": { "IndexName": "GenreAndPriceIndex", "KeySchema": [ {"AttributeName": "Genre", "KeyType": "HASH"}, # Partition key {"AttributeName": "Price", "KeyType": "RANGE"}, # Sort key ], "Projection": { "ProjectionType": "ALL" }, "ProvisionedThroughput": { "ReadCapacityUnits": 10,"WriteCapacityUnits": 10 } } } ] ) db3.meta.client.describe_table(TableName="Music")
output
{"ResponseMetadata": {"HTTPHeaders": {"content-length": "1082", "content-type": "application/x-amz-json-1.0", "server": "Jetty(8.1.12.v20130726)", "x-amz-crc32": "3717567836", "x-amzn-requestid": "d63c0176-8257-428b-b6f3-af87219ba45b"}, "HTTPStatusCode": 200, "RequestId": "d63c0176-8257-428b-b6f3-af87219ba45b", "RetryAttempts": 0}, u"Table": {u"AttributeDefinitions": [{u"AttributeName": u"Artist", u"AttributeType": u"S"}, {u"AttributeName": u"Price", u"AttributeType": u"N"}, {u"AttributeName": u"SongTitle", u"AttributeType": u"S"}, {u"AttributeName": u"Genre", u"AttributeType": u"S"}], u"CreationDateTime": datetime.datetime(2017, 1, 14, 3, 9, 42, 63000, tzinfo=tzlocal()), u"GlobalSecondaryIndexes": [{u"IndexArn": u"arn:aws:dynamodb:ddblocal:000000000000:table/Music/index/GenreAndPriceIndex", u"IndexName": u"GenreAndPriceIndex", u"IndexSizeBytes": 0, u"IndexStatus": u"ACTIVE", u"ItemCount": 0, u"KeySchema": [{u"AttributeName": u"Genre", u"KeyType": u"HASH"}, {u"AttributeName": u"Price", u"KeyType": u"RANGE"}], u"Projection": {u"ProjectionType": u"ALL"}, u"ProvisionedThroughput": {u"ReadCapacityUnits": 10, u"WriteCapacityUnits": 10}}], u"ItemCount": 0, u"KeySchema": [{u"AttributeName": u"Artist", u"KeyType": u"HASH"}, {u"AttributeName": u"SongTitle", u"KeyType": u"RANGE"}], u"ProvisionedThroughput": {u"LastDecreaseDateTime": datetime.datetime(1970, 1, 1, 8, 0, tzinfo=tzlocal()), u"LastIncreaseDateTime": datetime.datetime(1970, 1, 1, 8, 0, tzinfo=tzlocal()), u"NumberOfDecreasesToday": 0, u"ReadCapacityUnits": 10, u"WriteCapacityUnits": 10}, u"TableArn": u"arn:aws:dynamodb:ddblocal:000000000000:table/Music", u"TableName": u"Music", u"TableSizeBytes": 0, u"TableStatus": u"ACTIVE"}}
索引可以訪問替代查詢模式,并可以加快查詢速度。
無論使用的是關系數據庫還是 DynamoDB,在創建索引時都應謹慎。只要對表進行寫入,就必須更新表的所有索引。在具有大型表的寫入密集型環境中,這會占用大量系統資源。
為了對表中的數據進行高效訪問,Amazon DynamoDB 對主鍵屬性創建并維護索引。這可以讓應用程序通過指定主鍵值快速地檢索數據。
可以對表創建一個或多個二級索引,然后對這些索引發出 Query 或 Scan 請求,以便通過主鍵以外的屬性對數據進行高效訪問。
secondary index 是一種數據結構,它包含表中屬性的子集以及一個支持 Query 操作的替代鍵。我們可以使用 Query 從索引中檢索數據,其方式與對表使用 Query 大致相同。一個表可以有多個secondary index,這樣,應用程序可以訪問許多不同的查詢模式。
也可以對索引使用 Scan,其方式與對表使用 Scan 大致相同。
secondary index中的數據由從表投影 或復制到索引中的屬性組成。在創建secondary index時,可以定義索引的替代鍵以及要在索引中投影的任何其他屬性。DynamoDB 將這些屬性與表中的主鍵屬性一起復制到索引中。然后,就可以像查詢或掃描表一樣查詢或掃描該索引。
每個secondary index都由 DynamoDB 自動維護。在表中添加、修改或刪除項目時,表上的所有索引也會更新。
DynamoDB 支持兩種secondary index:
Global secondary index – 其分區鍵和排序鍵可以與表上的分區鍵和排序鍵不同的索引。global secondary index被視為“全局”,是因為對索引進行的查詢可以跨表中所有分區的所有數據。
Local secondary index – 一種分區鍵與表中的相同但排序鍵與表中的不同的索引。local secondary index的含義是“本地”,表示local secondary index的每個分區的范圍都限定為具有相同分區鍵值的表分區。
下表是global secondary index與local secondary index的主要差異:
性能 | 全局二級索引 | 本地二級索引 |
---|---|---|
鍵架構 | global secondary index的主鍵可以是簡單主鍵(分區鍵)或復合主鍵(分區鍵和排序鍵)。 | local secondary index的主鍵必須是復合主鍵(分區鍵和排序鍵)。 |
鍵屬性 | 索引分區鍵和排序鍵(如果有)可以是字符串、數字或二進制類型的任何表屬性。 | 索引的分區鍵是與表的分區鍵相同的屬性。排序鍵可以是字符串、數字或二進制類型的任何表屬性。 |
每個分區鍵值的大小限制 | global secondary index沒有大小限制。 | 對于每個分區鍵值,所有索引項目的大小總和必須為 10GB 或更小。 |
在線索引操作 | 可以在創建表時創建Global secondary index。也可以向現有表添加新global secondary index,或者刪除現有global secondary index。 | Local secondary index是在創建表的同時創建的。不能向現有表添加local secondary index,也不能刪除已存在的任何local secondary index。 |
查詢和分區 | 通過global secondary index,可以跨所有分區查詢整個表。 | 借助local secondary index,可以對查詢中分區鍵值指定的單個分區進行查詢。 |
讀取一致性 | 對global secondary index進行的查詢僅支持最終一致性。 | 查詢local secondary index時,可以選擇最終一致性或強一致性。 |
預配置吞吐量使用 | 每個global secondary index都有自己的用于讀取和寫入活動的預配置吞吐量設置。對global secondary index進行的查詢或掃描會占用索引(而非表)的容量單位。global secondary index更新也是如此,因為會進行表寫入。 | 對local secondary index進行的查詢或掃描會占用表的讀取容量單位。向表寫入時,其local secondary index也會更新;這些更新會占用表的寫入容量單位。 |
投影屬性 | 對于global secondary index查詢或掃描,只能請求投影到索引中的屬性。DynamoDB 不從表提取任何屬性。 | 如果您查詢或掃描local secondary index,可以請求未投影到索引中的屬性。DynamoDB 自動從表提取這些屬性。 |
如果要創建多個含有secondary index的表,必須按順序執行此操作。例如,先創建第一個表,等待其狀態變為 ACTIVE,創建下一個表,等待其狀態變為 ACTIVE,依此類推。如果我們嘗試同時創建多個含有secondary index的表,DynamoDB 會返回 LimitExceededException。
對于每個secondary index,必須指定以下內容:
要創建的索引的類型 – global secondary index或local secondary index。
索引的名稱。索引的命名規則與表的命名規則相同,對于聽一個表的不同索引,索名稱必須是唯一的,不過,與不同的表的索引的名稱可以相同。
索引的鍵架構。索引鍵架構中的每個屬性必須是類型為字符串、數字或二進制的頂級屬性。其他數據類型,包括文檔和集,均不受支持。鍵架構的其他要求取決于索引的類型:
對于global secondary index,分區鍵可以是任何標量表屬性。排序鍵是可選的,也可以是任何標量表屬性。
對于local secondary index,分區鍵必須與表的分區鍵相同,排序鍵必須是非鍵表屬性。
從表投影到索引中的其他屬性(如果有)必須是除表鍵屬性之外的屬性。(表鍵屬性會自動投影到每個索引)
索引的預配置吞吐量設置(如有必要):
對于global secondary index,必須指定讀取和寫入容量單位設置。這些預配置吞吐量設置獨立于表的設置。
對于local secondary index,無需指定讀取和寫入容量單位設置。對local secondary index進行的讀取和寫入操作會占用其父表的預配置吞吐量設置。
為獲得最大查詢靈活性,您可以為每個表創建最多 5 個 global secondary index和最多 5 個local secondary index。
可以使用 DescribeTable 操作獲取表上secondary index的詳細列表。DescribeTable 返回表上每個secondary index的名稱、存儲大小和項目數。系統并不會實時更新這些值,但會大約每隔六個小時刷新一次。
下一篇將會介紹DynamoDB的查詢和掃描
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38406.html
摘要:上一節我們介紹了項目的添加修改獲取刪除操作,這一節將介紹索引的創建及管理。創建索引在關系數據庫中,索引是一個數據結構,可對表中的不同的列執行快速查詢。但是,全局二級索引僅支持最終一致性。無論使用的是關系數據庫還是,在創建索引時都應謹慎。 上一節我們介紹了項目的添加、修改、獲取、刪除(CRUD)操作,這一節將介紹索引的創建及管理。 創建索引 在關系數據庫中,索引是一個數據結構,可對表中的...
摘要:使用配置注冊并創建訪問密鑰創建憑證文件開啟服務在計算機上運行除了服務之外,還提供可本地運行的可下載版本的。設置此參數有助于更逼真地模擬服務的行為。目前,此參數僅為處于或狀態的引入延遲。原文鏈接安裝及配置 什么是 Amazon DynamoDB Amazon DynamoDB 是一種完全托管的 NoSQL 數據庫服務,提供快速而可預測的性能,能夠實現無縫擴展。使用 DynamoDB,您可...
閱讀 3318·2023-04-25 16:25
閱讀 3823·2021-11-15 18:01
閱讀 1600·2021-09-10 11:21
閱讀 3007·2021-08-02 16:53
閱讀 3081·2019-08-30 15:55
閱讀 2489·2019-08-29 16:24
閱讀 2098·2019-08-29 13:14
閱讀 1027·2019-08-29 13:00