Diferenças entre um banco de dados relacional (SQL) e o DynamoDB ao gerenciar índices - Amazon DynamoDB

Diferenças entre um banco de dados relacional (SQL) e o DynamoDB ao gerenciar índices

Índices dão a você acesso a padrões de consulta alternativos, e você pode agilizar as consultas. Esta seção compara e contrasta a criação e o uso de índices no SQL e no Amazon DynamoDB.

Caso esteja usando um banco de dados relacional ou o DynamoDB, você deve ser criterioso com a criação do índice. Sempre que uma gravação ocorre em uma tabela, todos os índices da tabela devem ser atualizados. Em um ambiente que exige muita gravação com tabelas grandes, isso pode consumir grandes quantidades de recursos do sistema. Em um ambiente somente leitura ou em sua maioria de leitura, essa não é uma grande preocupação. Entretanto, você deve garantir que os índices estejam realmente sendo usados por seu aplicativo, e não simplesmente ocupando espaço.

Diferenças entre um banco de dados relacional (SQL) e o DynamoDB ao criar um índice

Compare a instrução CREATE INDEX em SQL com a operação UpdateTable no Amazon DynamoDB.

Criar um índice com o SQL

Em um banco de dados relacional, índice é uma estrutura de dados que permite realizar consultas rápidas em diferentes colunas em uma tabela. Você pode usar a instrução SQL CREATE INDEX para adicionar um índice a uma tabela existente, especificando as colunas a serem indexadas. Após a criação do índice, você pode consultar os dados na tabela como sempre, mas agora o banco de dados pode usar o índice para localizar rapidamente as linhas especificadas na tabela, em vez de verificar toda a tabela.

Depois que você cria um índice, o banco de dados o mantém para você. Sempre que você modifica os dados na tabela, o índice é modificado automaticamente para refletir as alterações da tabela.

No MySQL, você pode criar um índice da forma a seguir.

CREATE INDEX GenreAndPriceIndex ON Music (genre, price);

Criar um índice no DynamoDB

No DynamoDB você pode criar e usar um índice secundário para atender a objetivos semelhantes.

Os índices no DynamoDB são diferentes dos seus equivalentes relacionais. Ao criar um índice secundário, você deve especificar os atributos de chave: uma chave de partição e uma chave de classificação. Depois de criar o índice secundário, você pode usar a operação Query ou Scan da mesma forma como faria com uma tabela. O DynamoDB não tem um otimizador de consultas. Portanto, um índice secundário é usado apenas quando você usa a operação Query ou Scan.

O DynamoDB aceita dois tipos diferentes de índices:

  • Os índices secundários globais: a chave primária do índice pode ser qualquer dois atributos de sua tabela.

  • Índices secundários locais: a chave de partição do índice deve ser a mesma que a chave de partição de sua tabela. No entanto, a chave de classificação pode ser qualquer outro atributo.

O DynamoDB garante que os dados em um índice secundário sejam finais consistentes com sua tabela. Você pode solicitar operações Query ou Scan altamente consistentes em uma tabela ou em um índice secundário local. No entanto, índices secundários globais somente oferecem suporte à consistência eventual.

É possível adicionar um índice secundário global a uma tabela existente usando a operação UpdateTable e especificando 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 } } } ] }

Você deve fornecer os parâmetros a seguir para UpdateTable:

  • TableName: a tabela à qual o índice será associado.

  • AttributeDefinitions: os tipos de dados dos atributos de esquema de chaves do índice.

  • GlobalSecondaryIndexUpdates: detalhes sobre o índice que você deseja criar:

    • IndexName: um nome para o índice.

    • KeySchema: os atributos que são usados para a chave primária do índice.

    • Projection: atributos da tabela que são copiados para o índice. Neste caso, ALL significa que todos os atributos são copiados.

    • ProvisionedThroughput (for provisioned tables): o número de leituras e gravações por segundo que são necessários para este índice. (Isso é separado das configurações de throughput provisionado da tabela.)

Parte dessa operação envolve backfilling de dados da tabela para o novo índice. Durante o backfilling, a tabela permanece disponível. No entanto, o índice não está pronto até que seu atributo Backfilling mude de verdadeiro para falso. Você pode usar a operação DescribeTable para visualizar esse atributo.

Diferenças entre um banco de dados relacional (SQL) e o DynamoDB ao consultar e varrer um índice

Compare a consulta e a verificação de um índice usando a instrução SELECT em SQL com as operações Query e Scan no Amazon DynamoDB.

Consultar e verificar um índice com o SQL

Em um banco de dados relacional, você não trabalha diretamente com índices. Em vez disso, você consulta tabelas, emitindo instruções SELECT, e o otimizador de consultas pode fazer uso de índices.

Um otimizador de consultas é um componente do sistema de gerenciamento de banco de dados relacional (RDBMS - relational database management system) que avalia os índices disponíveis e determina se eles podem ser usados para agilizar uma consulta. Se os índices puderem ser usados para acelerar uma consulta, o RDBMS acessará o índice primeiro e, em seguida, o usará para localizar os dados na tabela.

Estas são algumas instruções SQL que podem usar GenreAndPriceIndex para melhorar a performance. Presumimos que a tabela Music tenha dados suficientes para que o otimizador de consultas decida usar esse índice, em vez de simplesmente verificar a tabela inteira.

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

Consultar e verificar um índice no DynamoDB

No DynamoDB, execute as operações Query e Scan diretamente no índice, como faria em uma tabela. É possível usar a API do DynamoDB ou do PartiQL (uma linguagem de consultas compatível com SQL) para consultar ou verificar o índice. Você deve especificar TableName e IndexName.

As seguintes são algumas consultas sobre GenreAndPriceIndex no DynamoDB. (O esquema de chaves desse índice consiste em Genre e Price.)

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

Este exemplo usa uma ProjectionExpression para indicar que somente alguns dos atributos, em vez de todos eles, são exibidos nos resultados.

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

Veja a seguir uma verificação em GenreAndPriceIndex.

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

Com PartiQL, use a instrução Select PartiQL para realizar consultas e varreduras no índice.

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

Veja a seguir uma verificação em GenreAndPriceIndex.

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

Para obter exemplos de códigos que usam Select, consulte Instruções Select em PartiQL para DynamoDB.