Secundair indexeren in Azure Cosmos DB voor Apache Cassandra

VAN TOEPASSING OP: Cassandra

De API voor Cassandra in Azure Cosmos DB maakt gebruik van de onderliggende indexeringsinfrastructuur om de indexeringssterkte beschikbaar te maken die inherent is aan het platform. In tegenstelling tot de kern-API voor NoSQL indexeert API voor Cassandra in Azure Cosmos DB echter niet standaard alle kenmerken. In plaats daarvan ondersteunt het secundaire indexeren om een index te maken voor bepaalde kenmerken, die zich op dezelfde manier gedraagt als Apache Cassandra.

Over het algemeen wordt het afgeraden om filterquery's uit te voeren op de kolommen die niet zijn gepartitioneerd. U moet de syntaxis ALLOW FILTERING expliciet gebruiken, wat resulteert in een bewerking die mogelijk niet goed presteert. In Azure Cosmos DB kunt u dergelijke query's uitvoeren op kenmerken met een lage kardinaliteit, omdat ze in verschillende partities worden gebruikt om de resultaten op te halen.

Het is niet raadzaam om een index te maken voor een kolom die regelmatig wordt bijgewerkt. Het is verstandig om een index te maken wanneer u de tabel definieert. Dit zorgt ervoor dat gegevens en indexen een consistente status hebben. Als u een nieuwe index maakt voor de bestaande gegevens, kunt u momenteel de wijziging in de indexvoortgang voor de tabel niet bijhouden. Als u de voortgang voor deze bewerking wilt bijhouden, moet u de voortgangswijziging aanvragen via een ondersteuningsticket.

Notitie

Secundaire indexen kunnen alleen worden gemaakt met behulp van de CQL-opdrachten die in dit artikel worden genoemd, en niet via de hulpprogramma's van de resourceprovider (ARM-sjablonen, Azure CLI, PowerShell of Terraform). Secundaire indexen worden niet ondersteund voor de volgende objecten:

  • gegevenstypen zoals geblokkeerde verzamelingstypen, decimale typen en varianttypen.
  • Statische kolommen
  • Clusteringsleutels

Waarschuwing

Partitiesleutels worden niet standaard geïndexeerd in DE API voor Cassandra. Als u een samengestelde primaire sleutel in uw tabel hebt en u filtert op partitiesleutel en clustersleutel, of alleen op een partitiesleutel, geeft dit het gewenste gedrag. Als u echter filtert op partitiesleutel en andere niet-geïndexeerde velden behalve de clustersleutel, resulteert dit in een uitwaaiering van partitiesleutels, zelfs als de andere niet-geïndexeerde velden een secundaire index hebben. Als de tabel een samengestelde primaire sleutel bevat en u wilt filteren op zowel het partitiesleutelwaarde-element van de samengestelde primaire sleutel als een ander veld dat niet de partitiesleutel of clustersleutel is, moet u ervoor zorgen dat u expliciet een secundaire index toevoegt aan de partitiesleutel. De index in dit scenario zou de queryprestaties aanzienlijk moeten verbeteren, zelfs als de andere niet-partitiesleutel- en niet-clusteringsleutelvelden geen index hebben. Lees ons artikel over partitioneren voor meer informatie.

Voorbeeld van indexering

Maak eerst een voorbeeldsleutelruimte en tabel door de volgende opdrachten uit te voeren op de CQL-shellprompt:

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

Voeg vervolgens voorbeeldgegevens van gebruikers in met de volgende opdrachten:

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');

Als u de volgende instructie probeert uit te voeren, treedt er een fout op die u vraagt om te gebruiken ALLOW FILTERING:

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

Hoewel de API voor Cassandra ALLOW FILTERING ondersteunt, zoals vermeld in de vorige sectie, wordt dit niet aanbevolen. Maak in plaats daarvan een index in de zoals wordt weergegeven in het volgende voorbeeld:

CREATE INDEX ON sampleks.t1 (lastname);

Nadat u een index voor het veld 'lastname' hebt gemaakt, kunt u nu de vorige query uitvoeren. Met API voor Cassandra in Azure Cosmos DB hoeft u geen indexnaam op te geven. Er wordt een standaardindex met indeling tablename_columnname_idx gebruikt. Is bijvoorbeeld t1_lastname_idx de indexnaam voor de vorige tabel.

De index verwijderen

U moet weten wat de indexnaam is om de index te verwijderen. Voer de desc schema opdracht uit om de beschrijving van de tabel op te halen. De uitvoer van deze opdracht bevat de indexnaam in de indeling CREATE INDEX tablename_columnname_idx ON keyspacename.tablename(columnname). Vervolgens kunt u de indexnaam gebruiken om de index te verwijderen, zoals wordt weergegeven in het volgende voorbeeld:

drop index sampleks.t1_lastname_idx;

Volgende stappen