Partilhar via


Indexação secundária no Azure Cosmos DB para Apache Cassandra

APLICA-SE A: Cassandra

A API para Cassandra no Azure Cosmos DB aproveita a infraestrutura de indexação subjacente para expor a força de indexação inerente à plataforma. No entanto, ao contrário da API principal para NoSQL, a API para Cassandra no Azure Cosmos DB não indexa todos os atributos por padrão. Em vez disso, ele suporta indexação secundária para criar um índice em determinados atributos, que se comporta da mesma maneira que o Apache Cassandra.

Em geral, não é aconselhável executar consultas de filtro nas colunas que não estão particionadas. Você deve usar a sintaxe ALLOW FILTERING explicitamente, o que resulta em uma operação que pode não ter um bom desempenho. No Azure Cosmos DB, você pode executar essas consultas em atributos de cardinalidade baixa porque eles se espalham entre partições para recuperar os resultados.

Não é aconselhável criar um índice em uma coluna atualizada com frequência. É prudente criar um índice ao definir a tabela. Isso garante que os dados e índices estejam em um estado consistente. Caso você crie um novo índice nos dados existentes, atualmente, não é possível acompanhar a alteração do progresso do índice para a tabela. Se você precisar acompanhar o progresso desta operação, você tem que solicitar a alteração de progresso através de um tíquete de suporte.

Nota

Os índices secundários só podem ser criados usando os comandos CQL mencionados neste artigo, e não por meio dos utilitários do Provedor de Recursos (modelos ARM, CLI do Azure, PowerShell ou Terraform). Não há suporte para índices secundários nos seguintes objetos:

  • tipos de dados, como tipos de coleção congelada, tipos decimais e variantes.
  • Colunas estáticas
  • Chaves de agrupamento

Aviso

As chaves de partição não são indexadas por padrão na API para Cassandra. Se você tiver uma chave primária composta em sua tabela e filtrar a chave de partição e a chave de clustering, ou apenas a chave de partição, isso dará o comportamento desejado. No entanto, se você filtrar a chave de partição e quaisquer outros campos não indexados além da chave de clustering, isso resultará em uma distribuição de chave de partição - mesmo que os outros campos não indexados tenham um índice secundário. Se você tiver uma chave primária composta em sua tabela e quiser filtrar o elemento de valor da chave de partição da chave primária composta, além de outro campo que não seja a chave de partição ou a chave de clustering, certifique-se de adicionar explicitamente um índice secundário na chave de partição. O índice neste cenário deve melhorar significativamente o desempenho da consulta, mesmo que os outros campos de chave não particionária e de chave não clustering não tenham índice. Consulte o nosso artigo sobre particionamento para obter mais informações.

Exemplo de indexação

Primeiro, crie um espaço de chave e uma tabela de exemplo executando os seguintes comandos no prompt do shell CQL:

CREATE KEYSPACE sampleks WITH REPLICATION = {'class' : 'SimpleStrategy'};
CREATE TABLE sampleks.t1(user_id int PRIMARY KEY, lastname text) WITH cosmosdb_provisioned_throughput=400;

Em seguida, insira dados de usuário de exemplo com os seguintes comandos:

insert into sampleks.t1(user_id,lastname) values (1, 'nishu');
insert into sampleks.t1(user_id,lastname) values (2, 'vinod');
insert into sampleks.t1(user_id,lastname) values (3, 'bat');
insert into sampleks.t1(user_id,lastname) values (5, 'vivek');
insert into sampleks.t1(user_id,lastname) values (6, 'siddhesh');
insert into sampleks.t1(user_id,lastname) values (7, 'akash');
insert into sampleks.t1(user_id,lastname) values (8, 'Theo');
insert into sampleks.t1(user_id,lastname) values (9, 'jagan');

Se você tentar executar a seguinte instrução, você encontrará um erro que solicita que você use ALLOW FILTERING:

select user_id, lastname from sampleks.t1 where lastname='nishu';

Embora a API para Cassandra suporte PERMITIR FILTRAGEM, como mencionado na seção anterior, não é recomendado. Em vez disso, você deve criar um índice no como mostrado no exemplo a seguir:

CREATE INDEX ON sampleks.t1 (lastname);

Depois de criar um índice no campo "sobrenome", agora você pode executar a consulta anterior com êxito. Com a API para Cassandra no Azure Cosmos DB, não é necessário fornecer um nome de índice. Um índice padrão com formato tablename_columnname_idx é usado. Por exemplo, t1_lastname_idx é o nome do índice para a tabela anterior.

Queda do índice

Você precisa saber qual é o nome do índice para descartá-lo. Execute o desc schema comando para obter a descrição da tabela. A saída deste comando inclui o nome do índice no formato CREATE INDEX tablename_columnname_idx ON keyspacename.tablename(columnname). Em seguida, você pode usar o nome do índice para descartar o índice, conforme mostrado no exemplo a seguir:

drop index sampleks.t1_lastname_idx;

Próximos passos