Delen via


Secundaire indexering 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 weer te geven die inherent is aan het platform. In tegenstelling tot de kern-API voor NoSQL indexeert API voor Cassandra in Azure Cosmos DB niet standaard alle kenmerken. In plaats daarvan ondersteunt het secundaire indexeren om een index te maken op bepaalde kenmerken, die zich op dezelfde manier gedragen als Apache Cassandra.

Over het algemeen is het niet raadzaam 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 deze uitwaaieren over meerdere partities om de resultaten op te halen.

Het is niet raadzaam om een index te maken voor een regelmatig bijgewerkte kolom. 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 de voortgang van de index voor de tabel momenteel 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 resourceproviderhulpprogramma's (ARM-sjablonen, Azure CLI, PowerShell of Terraform). Secundaire indexen worden niet ondersteund op de volgende objecten:

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

Waarschuwing

Partitiesleutels worden niet standaard geïndexeerd in API voor Cassandra. Als u een samengestelde primaire sleutel in uw tabel hebt en u filtert op partitiesleutel en clustersleutel, of alleen partitiesleutel, geeft dit het gewenste gedrag. Als u echter filtert op partitiesleutel en andere niet-geïndexeerde velden naast de clusteringsleutel, resulteert dit in een fan-out van partitiesleutels, zelfs als de andere niet-geïndexeerde velden een secundaire index hebben. Als u een samengestelde primaire sleutel in de tabel hebt en u wilt filteren op zowel het element van de partitiesleutelwaarde van de samengestelde primaire sleutel, plus 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 moet de queryprestaties aanzienlijk 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 waarbij u wordt gevraagd om het volgende te gebruiken ALLOW FILTERING:

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

Hoewel de API voor Cassandra ONDERSTEUNING biedt voor ALLOW FILTERING, zoals vermeld in de vorige sectie, wordt dit niet aanbevolen. U moet in plaats daarvan een index maken in de index zoals wordt weergegeven in het volgende voorbeeld:

CREATE INDEX ON sampleks.t1 (lastname);

Nadat u een index hebt gemaakt in het veld Achternaam, kunt u de vorige query nu 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