管理索引時關聯式 (SQL) 資料庫與 DynamoDB 之間的差異 - Amazon DynamoDB

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

管理索引時關聯式 (SQL) 資料庫與 DynamoDB 之間的差異

索引提供您替代的查詢模式,可加速查詢。本節比較和對比 SQL和 Amazon DynamoDB 中的索引建立和使用。

無論您是使用關聯式資料庫或 DynamoDB,都應明智地建立索引。每當寫入資料表時,資料表的所有索引都必須更新。在大型資料表的大量寫入環境中,這可能會使用大量系統資源。在唯讀或大部分讀取的環境中,這不算是問題。但是,您應確認應用程式確實使用了索引,而非只是占用空間。

建立索引時關聯式 (SQL) 資料庫與 DynamoDB 之間的差異

將 中的CREATE INDEX陳述式SQL與 Amazon DynamoDB 中的 UpdateTable操作進行比較。

使用 建立索引 SQL

在關聯式資料庫中,索引是一種資料結構,可讓您快速查詢資料表中的不同資料行。您可以使用 CREATE INDEXSQL陳述式將索引新增至現有資料表,指定要編製索引的欄。在索引建立後,您可以如常地查詢資料表中的資料,但資料庫現在已可使用索引在快速尋找資料表中的指定資料列,而不用掃描整個資料表。

在您建立索引後,資料庫會為您維護。每當您修改資料表中的資料時,索引就會自動修改,以反映資料表的變更。

在我的 中SQL,您會建立如下所示的索引。

CREATE INDEX GenreAndPriceIndex ON Music (genre, price);

在 DynamoDB 中建立索引

在 DynamoDB 中,您可以建立及使用次要索引來達到類似目的。

DynamoDB 中的索引與關聯式資料庫中的索引不同。在您建立次要索引時,必須指定其索引鍵屬性,即一個分割區索引鍵和一個排序索引鍵。在建立次要索引後,您便可以 QueryScan 該索引,正如您對資料表所做的那樣。DynamoDB 沒有查詢最佳化程式,因此只有在您 QueryScan 次要索引時才會使用此類索引。

DynamoDB 支援兩種不同的索引:

  • 全域次要索引:索引的主索引鍵可以是資料表中任兩個屬性。

  • 本機次要索引:索引的分割區索引鍵必須與資料表的分割區索引鍵相同。但是,排序索引鍵可以是其他任何屬性。

DynamoDB 會確認次要索引中的資料最終與其資料表一致。您可以對資料表或本機次要索引請求高度一致的 QueryScan 操作。但是,全域次要索引只支援最終一致性。

您可以使用 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 中的 QueryScan操作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 中,您可以直接在索引上執行 QueryScan 操作,與您在資料表上的操作方式相同。您可以使用 DynamoDB API或 PartiQL (一種 SQL相容的查詢語言) 來查詢或掃描索引。您必須同時指定 TableNameIndexName

以下是 DynamoDB GenreAndPriceIndex中 上的一些查詢。(此索引的索引鍵結構描述包含 GenrePrice)。

DynamoDB API
// All of the rock songs { TableName: "Music", IndexName: "GenreAndPriceIndex", KeyConditionExpression: "Genre = :genre", ExpressionAttributeValues: { ":genre": "Rock" }, };

此範例使用 ProjectionExpression 指出您只想要在結果中顯示部分屬性,而非所有屬性。

// All of the cheap country songs { TableName: "Music", IndexName: "GenreAndPriceIndex", KeyConditionExpression: "Genre = :genre and Price < :price", ExpressionAttributeValues: { ":genre": "Country", ":price": 0.50 }, ProjectionExpression: "Artist, SongTitle, Price" };

以下是 上的掃描GenreAndPriceIndex

// Return all of the data in the index { TableName: "Music", IndexName: "GenreAndPriceIndex" }
PartiQL for DynamoDB

使用 PartiQL,您可以使用 PartiQL Select 陳述式對索引執行查詢和掃描。

// All of the rock songs SELECT * FROM Music.GenreAndPriceIndex WHERE Genre = 'Rock'
// All of the cheap country songs SELECT * FROM Music.GenreAndPriceIndex WHERE Genre = 'Rock' AND Price < 0.50

以下是 上的掃描GenreAndPriceIndex

// Return all of the data in the index SELECT * FROM Music.GenreAndPriceIndex
注意

如需使用 Select 的程式碼範例,請參閱 適用於 DynamoDB 的 PartiQL Select 陳述式