Differenze tra un database relazionale (SQL) e DynamoDB nella gestione degli indici - Amazon DynamoDB

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Differenze tra un database relazionale (SQL) e DynamoDB nella gestione degli indici

Gli indici consentono di accedere a modelli di query alternativi e possono velocizzare le query. Questa sezione confronta e contrappone la creazione e l'utilizzo dell'indice in Amazon SQL DynamoDB.

Che si stia utilizzando un database relazionale o DynamoDB, è necessario eseguire con attenzione la creazione dell'indice. Ogni volta che una scrittura si verifica su una tabella, tutti gli indici della tabella devono essere aggiornati. In un ambiente di scrittura con tabelle di grandi dimensioni, questa operazione può consumare grandi quantità di risorse di sistema. In un ambiente di sola lettura o pressoché di sola lettura, questa operazione non costituisce un problema, ma devi assicurarti che gli indici vengano effettivamente utilizzati dall'applicazione e non occupino semplicemente spazio.

Differenze tra un database relazionale (SQL) e DynamoDB durante la creazione di un indice

Confronta l'CREATE INDEXistruzione SQL con l'UpdateTableoperazione in Amazon DynamoDB.

Creazione di un indice con SQL

In un database relazionale, un indice è una struttura di dati che ti consente di eseguire query veloci su colonne diverse in una tabella. È possibile utilizzare l'CREATE INDEXSQListruzione per aggiungere un indice a una tabella esistente, specificando le colonne da indicizzare. Dopo aver creato l'indice, puoi eseguire una query sui dati della tabella come di consueto, ma ora il database può utilizzare l'indice per trovare rapidamente le righe specificate nella tabella anziché eseguire la scansione dell'intera tabella.

Dopo aver creato un indice, il database lo gestisce automaticamente. Ogni volta che modifichi i dati nella tabella, l'indice viene modificato automaticamente per riflettere le modifiche nella tabella.

In MySQL, creeresti un indice come il seguente.

CREATE INDEX GenreAndPriceIndex ON Music (genre, price);

Creazione di un indice in DynamoDB

In , puoi creare e usare un per scopi simili.

Gli indici in DynamoDB sono diversi dalle rispettive controparti relazionali. Quando crei un indice secondario globale, specifica una chiave di partizione e opzionalmente una chiave di ordinamento. Dopo aver creato l'indice secondario, è possibileQueryoScanproprio come faresti con un tavolo. DynamoDB non dispone di un ottimizzatore di query, quindi un indice secondario viene utilizzato solo quandoQueryoScanesso.

DynamoDB supporta due diversi tipi di indici:

  • Indici secondari globali: la chiave primaria dell'indice può essere qualsiasi due attributi della relativa tabella.

  • Indici secondari locali: la chiave di partizione dell'indice deve essere uguale a quella della chiave di partizione della tabella. Tuttavia, la chiave di ordinamento può essere un qualsiasi altro attributo.

assicura che i dati in un sono consistenti con la tabella. Puoi richiedere operazioni Query o Scan ad elevata consistenza su una tabella o un indice secondario locale. Tuttavia, gli indici secondari globali supportano solo la consistenza finale.

È possibile aggiungere un indice secondario globale a una tabella esistente utilizzando l'operazione UpdateTable e specificando 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 } } } ] }

Dovrai fornire i seguenti parametri a UpdateTable:

  • TableName— La tabella a cui verrà associato l'indice.

  • AttributeDefinitions— I tipi di dati per gli attributi dello schema chiave dell'indice.

  • GlobalSecondaryIndexUpdates— Dettagli sull'indice che desideri creare:

    • IndexName: un nome per l'indice.

    • KeySchema— Gli attributi utilizzati per la chiave primaria dell'indice.

    • Projection - Specifica gli attributi che vengono copiati (proiettati) dalla tabella nell'indice. In questo caso, ALL significa che tutti gli attributi sono copiati.

    • ProvisionedThroughput (for provisioned tables)— Il numero di letture e scritture al secondo necessarie per questo indice. Questo valore è separato dalle impostazioni di throughput assegnato dalla tabella.

Parte di questa operazione comporta la compilazione dei dati dalla tabella nel nuovo indice. Durante la compilazione la tabella rimane disponibile. Tuttavia, l'indice non è pronto fino a quando l'attributo Backfilling cambia da true a false. Puoi utilizzare l'operazione DescribeTable per visualizzare questo attributo.

Differenze tra un database relazionale (SQL) e DynamoDB durante l'interrogazione e la scansione di un indice

Confronta l'interrogazione e la scansione di un indice utilizzando l'SELECTistruzione in SQL con le Scan operazioni Query and in Amazon DynamoDB.

Interrogazione e scansione di un indice con SQL

In un database relazionale, non si lavora direttamente con gli indici. Si eseguono invece query sulle tabelle emettendo istruzioni SELECT in modo che l'ottimizzatore di query possa fare uso di qualsiasi indice.

Un ottimizzatore di query è un componente del sistema di gestione di database relazionali (RDBMS) che valuta gli indici disponibili e determina se possono essere utilizzati per velocizzare una query. Se è possibile utilizzare gli indici per velocizzare una query, RDBMS accede prima all'indice e poi lo utilizza per individuare i dati nella tabella.

Di seguito sono SQL riportate alcune affermazioni che possono essere utilizzate GenreAndPriceIndexper migliorare le prestazioni. Supponiamo che la tabella Music contenga i dati sufficienti che l'ottimizzatore di query decida di usare questo indice, piuttosto che scansionare l'intera tabella.

/* 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;

Esecuzione di query e scansione di un indice in DynamoDB

In DynamoDB, le operazioni Query e Scan vengono eseguite direttamente sull'indice, nello stesso modo in cui vengono eseguite su una tabella. È possibile utilizzare API DynamoDB o PartiQL SQL (un linguaggio di query compatibile) per interrogare o scansionare l'indice. Devi specificare TableName e IndexName.

Di seguito sono riportate alcune domande su GenreAndPriceIndexDynamoDB. Lo schema della chiave per l'indice è composto dagli attributi Genre e Price.

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

Questo esempio utilizza un ProjectionExpression per indicare che si vogliono solo alcuni degli attributi, piuttosto che tutti, nei risultati.

// 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" };

Di seguito è riportata una scansione in corso. GenreAndPriceIndex

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

Con PartiQL, puoi utilizzare l’istruzione Select PartiQL per eseguire query e scansioni sull'indice.

// 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

Quanto segue è una scansione in corso GenreAndPriceIndex.

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

Per esempi di codice che utilizzano Select, consulta Istruzioni SELECT PartiQL per DynamoDB.