Melhorar o acesso aos dados com índices secundários no DynamoDB
O Amazon DynamoDB dá acesso rápido a itens em uma tabela ao especificar valores de chave primária. No entanto, muitos aplicativos podem se beneficiar por terem uma ou mais chaves secundárias (ou alternativas) disponíveis, para permitir acesso eficiente aos dados com atributos que não sejam a chave primária. Para resolver isso, você pode criar um ou mais índices secundários em uma tabela e emitir solicitações de Query
ou de Scan
nesses índices.
Um índice secundário é uma estrutura de dados que contém um subconjunto de atributos de uma tabela, juntamente com uma chave alternativa para oferecer suporte a operações Query
. Você pode recuperar dados do índice usando uma Query
, de maneira muito semelhante ao uso de uma Query
com uma tabela. Uma tabela pode ter vários índices secundários, o que permite que seus aplicativos tenham acesso a muitos padrões de consulta diferentes.
nota
Você também pode Scan
um índice, da mesma forma como poderia Scan
uma tabela.
Cada índice secundário está associado a exatamente uma tabela, da qual ele obtém seus dados. Ela é chamada de tabela base para o índice. Ao criar um índice, você define uma chave alternativa para ele (chave de partição e chave de classificação). Você também define os atributos a serem projetados, ou copiados, da tabela-base para o índice. O DynamoDB copia esses atributos para o índice, juntamente com os atributos de chave primária da tabela-base. Você pode consultar ou verificar o índice como faria com qualquer tabela.
Cada índice secundário é automaticamente mantido pelo DynamoDB. Quando você adiciona, modifica ou exclui itens na tabela base, todos os índices dessa tabela também são atualizados para refletir essas alterações.
O DynamoDB oferece suporte a dois tipos de índices secundários:
-
Índice secundário global: um índice com uma chave de partição e uma chave de classificação que podem ser diferentes daquelas contidas na tabela-base. Um índice secundário global é considerado “global” porque as consultas no índice podem abranger todos os dados em uma tabela base, além de todas as partições. O índice secundário global é armazenado em seu próprio espaço de partição longe da tabela-base e é dimensionado separadamente da tabela-base.
-
Índice secundário local: um índice que tem a mesma chave de partição que a tabela-base, mas uma chave de classificação diferente. Um índice secundário local é “local” no sentido de que cada partição de um índice secundário local tem a determinação de escopo para uma partição de tabela base com o mesmo valor de chave de partição.
Para ver uma comparação entre índices secundários globais e índices secundários locais, assista a este vídeo.
Você deve considerar os requisitos do seu aplicativo ao determinar qual tipo de índice usar. A tabela a seguir mostra as principais diferenças entre um índice secundário global e um índice secundário local.
Característica | Índice secundário global | Índice secundário local |
---|---|---|
Esquema de chaves | A chave primária de um índice secundário global pode ser simples (chave de partição) ou composta (chave de partição e chave de classificação). | A chave primária de um índice secundário local deve ser composta (chave de partição e chave de classificação). |
Atributos de chaves | A chave de partição e a chave de classificação (se presente) do índice podem ser qualquer atributo da tabela base do tipo String, Número ou Binário. | A chave de partição do índice é o mesmo atributo que a chave de partição da tabela base. A chave de classificação pode ser qualquer atributo da tabela base do tipo String, Número ou Binário. |
Restrições de tamanho por valor de chave de partição | Não há restrições de tamanho para índices secundários globais. | Para cada valor de chave de partição, o tamanho total de todos os itens indexados deve ser 10 GB ou menos. |
Operações de índice online | Você pode criar índices secundários globais ao mesmo tempo que cria uma tabela. Você também pode adicionar um novo índice secundário global a uma tabela ou então excluí-lo. Para ter mais informações, consulte Gerenciar índices secundários globais no DynamoDB. | Você pode criar índices secundários locais ao mesmo tempo que cria uma tabela. Não é possível adicionar um índice secundário local a uma tabela existente nem excluir índices secundários existentes. |
Consultas e partições | Um índice secundário global permite que você consulte a tabela inteira, em todas as partições. | Um índice secundário local permite consultar uma única partição, conforme especificado pelo valor da chave de partição na consulta. |
Consistência de leituras | As consultas em índices secundários globais oferecem suporte somente à consistência final. | Ao consultar um índice secundário local, você pode escolher consistência final ou coerência forte. |
Consumo de throughput provisionado | Cada índice secundário global tem suas próprias configurações de throughput provisionado para atividades de leitura e gravação. Consultas ou verificações em um índice secundário global consumem unidades de capacidade do índice, e não da tabela-base. O mesmo vale para atualizações de índices secundários globais devido a gravações de tabelas. Um índice secundário global associado a tabelas globais consome unidades de capacidade de gravação. | Consultas ou verificações em um índice secundário local consomem unidades de capacidade de leitura da tabela-base. Quando você grava em uma tabela, seus índices secundários locais também são atualizados. Essas atualizações consomem unidades de capacidade de gravação da tabela-base. Um índice secundário local associado a tabelas globais consome unidades de capacidade de gravação replicadas. |
Atributos projetados | Com consultas ou verificações em um índice secundário global, você pode solicitar somente os atributos que estão projetados no índice. O DynamoDB não busca atributos da tabela. | Se você consultar ou verificar um índice secundário local, poderá solicitar atributos que não estão projetados no índice. O DynamoDB buscará automaticamente os atributos da tabela. |
Se quiser criar mais de uma tabela com índices secundários, você deverá fazer isso sequencialmente. Por exemplo, você poderia criar a primeira tabela e esperar até que ela entrasse no estado ACTIVE
. Em seguida, você criaria a seguinte tabela e esperaria até que ela entrasse no estado ACTIVE
e assim por diante. Se você tentar criar mais de uma tabela ao mesmo tempo com um índice secundário, o DynamoDB retornará uma LimitExceededException
.
Cada índice secundário usa a mesma classe de tabela e modo de capacidade da tabela-base à qual está associado. Para cada índice secundário, é necessário especificar o seguinte:
-
O tipo de índice a ser criado: índice secundário global ou índice secundário local.
-
Um nome para o índice. As regras de nomenclatura de índices são iguais às de tabelas, conforme listado em Service quotas, conta e cotas de tabela no Amazon DynamoDB. O nome deve ser exclusivo para a tabela-base à qual ele está associado, mas você pode usar o mesmo nome para índices que estão associados a diferentes tabelas-base.
-
O esquema de chaves do índice. Cada atributo no esquema de chaves do índice deve ser um atributo de nível superior do tipo
String
.Number
ouBinary
. Outros tipos de dados, incluindo documentos e conjuntos, não são permitidos. Outros requisitos para o esquema de chaves dependem do tipo de índice:-
Para um índice secundário global, a chave de partição pode ser qualquer atributo escalar da tabela-base. Uma chave de classificação é opcional e também pode ser qualquer atributo escalar da tabela-base.
-
Para um índice secundário local, a chave de partição deve igual à chave de partição da tabela-base, e a chave de classificação deve ser um atributo da tabela-base não relacionado a chaves.
-
-
Atributos adicionais, se houver, a serem projetados da tabela-base no índice. Esses atributos são adicionais aos atributos de chave da tabela, que são automaticamente projetados em cada índice. Você pode projetar atributos de qualquer tipo de dados, incluindo escalares, documentos e conjuntos.
-
As configurações de throughput provisionado para o índice, se necessário:
-
Para um índice secundário global, você deve especificar configurações de unidades de capacidade de gravação. Essas configurações de throughput provisionado são independentes das configurações da tabela-base.
-
Para um índice secundário local, não é necessário especificar configurações de unidades de capacidade de gravação. Qualquer operação de leitura e gravação em um índice secundário extrai das configurações de throughput provisionado de sua tabela-base.
-
Para obter a flexibilidade máxima nas consultas, é possível criar até 20 índices secundários globais (cota padrão) e até 5 índices secundários locais por tabela.
A cota de índices secundários globais por tabela é 20 para as seguintes regiões da AWS:
-
AWS GovCloud (Leste dos EUA)
-
AWS GovCloud (Oeste dos EUA)
-
Europa (Estocolmo)
Para obter uma listagem detalhada de índices secundários em uma tabela, use a operação DescribeTable
. DescribeTable
retorna o nome, o tamanho de armazenamento e as contagens de itens de cada índice secundário na tabela. Esses valores não são atualizados em tempo real, mas aproximadamente a cada seis horas.
Você pode acessar os dados em um índice secundário usando a operação Query
ou Scan
. Você deve especificar o nome da tabela-base e o nome do índice que deseja usar, os atributos a serem retornados nos resultados e qualquer expressão de condição a ser aplicada. O DynamoDB pode retornar os resultados em ordem crescente ou decrescente.
Quando uma tabela é excluída, todos os índices associados a ela também são excluídos.
Para ver as práticas recomendadas, consulte Práticas recomendadas para uso de índices secundários no DynamoDB.