本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
管理索引時關聯式 (SQL) 資料庫與 DynamoDB 之間的差異
索引提供您替代的查詢模式,可加速查詢。本節比較和對比 SQL和 Amazon DynamoDB 中的索引建立和使用。
無論您是使用關聯式資料庫或 DynamoDB,都應明智地建立索引。每當寫入資料表時,資料表的所有索引都必須更新。在大型資料表的大量寫入環境中,這可能會使用大量系統資源。在唯讀或大部分讀取的環境中,這不算是問題。但是,您應確認應用程式確實使用了索引,而非只是占用空間。
建立索引時關聯式 (SQL) 資料庫與 DynamoDB 之間的差異
將 中的CREATE INDEX
陳述式SQL與 Amazon DynamoDB 中的 UpdateTable
操作進行比較。
使用 建立索引 SQL
在關聯式資料庫中,索引是一種資料結構,可讓您快速查詢資料表中的不同資料行。您可以使用 CREATE INDEX
SQL陳述式將索引新增至現有資料表,指定要編製索引的欄。在索引建立後,您可以如常地查詢資料表中的資料,但資料庫現在已可使用索引在快速尋找資料表中的指定資料列,而不用掃描整個資料表。
在您建立索引後,資料庫會為您維護。每當您修改資料表中的資料時,索引就會自動修改,以反映資料表的變更。
在我的 中SQL,您會建立如下所示的索引。
CREATE INDEX GenreAndPriceIndex ON Music (genre, price);
在 DynamoDB 中建立索引
在 DynamoDB 中,您可以建立及使用次要索引來達到類似目的。
DynamoDB 中的索引與關聯式資料庫中的索引不同。在您建立次要索引時,必須指定其索引鍵屬性,即一個分割區索引鍵和一個排序索引鍵。在建立次要索引後,您便可以 Query
或 Scan
該索引,正如您對資料表所做的那樣。DynamoDB 沒有查詢最佳化程式,因此只有在您 Query
或 Scan
次要索引時才會使用此類索引。
DynamoDB 支援兩種不同的索引:
-
全域次要索引:索引的主索引鍵可以是資料表中任兩個屬性。
-
本機次要索引:索引的分割區索引鍵必須與資料表的分割區索引鍵相同。但是,排序索引鍵可以是其他任何屬性。
DynamoDB 會確認次要索引中的資料最終與其資料表一致。您可以對資料表或本機次要索引請求高度一致的 Query
或 Scan
操作。但是,全域次要索引只支援最終一致性。
您可以使用 UpdateTable
操作並指定 GlobalSecondaryIndexUpdates
,對現有的資料表新增全域次要索引。
{ 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: { // Only specified if using provisioned mode "ReadCapacityUnits": 1,"WriteCapacityUnits": 1 } } } ] }
您必須提供下列參數給 UpdateTable
:
-
TableName
:會與索引相關聯的資料表。 -
AttributeDefinitions
:索引之索引鍵結構描述屬性的資料類型。 -
GlobalSecondaryIndexUpdates
:您想要建立之索引的相關詳細資訊:-
IndexName
:索引的名稱。 -
KeySchema
:用於索引主索引鍵的屬性。 -
Projection
:資料表中複製到索引的屬性。在此案例中,ALL
表示會複製所有屬性。 -
ProvisionedThroughput (for provisioned tables)
:此索引所需的每秒讀取及寫入數。(這和資料表的佈建輸送量設定是分開的。)
-
部分此操作會涉及將資料表中的資料回填到新的索引。在回填過程中,資料表仍可使用。但是,在索引的 Backfilling
屬性從 true 變更為 false 之前,索引都尚未就緒。您可以使用 DescribeTable
操作來檢視此屬性。
查詢和掃描索引時關聯式 (SQL) 資料庫和 DynamoDB 之間的差異
使用 中的 SELECT 陳述式與 Amazon DynamoDB 中的 Query
和 Scan
操作SQL,比較查詢和掃描索引。
使用 查詢和掃描索引 SQL
在關聯式資料庫中,您不會直接使用索引。而是透過發出 SELECT
陳述式查詢資料表,然後查詢最佳化器就可使用任何索引。
查詢最佳化工具是一種關聯式資料庫管理系統 (RDBMS) 元件,可評估可用的索引,並判斷它們是否可以用於加速查詢。如果索引可用來加速查詢,則 會先RDBMS存取索引,然後使用它來尋找資料表中的資料。
以下是可用來GenreAndPriceIndex改善效能的一些SQL陳述式。我們假設 Music 資料表具有足夠的資料,可讓查詢最佳化器決定使用此索引,而非單純地掃描整個資料表。
/* All of the rock songs */ SELECT * FROM Music WHERE Genre = 'Rock';
/* All of the cheap country songs */ SELECT Artist, SongTitle, Price FROM Music WHERE Genre = 'Country' AND Price < 0.50;
在 DynamoDB 中查詢及掃描索引
在 DynamoDB 中,您可以直接在索引上執行 Query
和 Scan
操作,與您在資料表上的操作方式相同。您可以使用 DynamoDB API或 PartiQL (一種 SQL相容的查詢語言) 來查詢或掃描索引。您必須同時指定 TableName
和 IndexName
。
以下是 DynamoDB GenreAndPriceIndex中 上的一些查詢。(此索引的索引鍵結構描述包含 Genre 和 Price)。