Dela via


Sekundär indexering i Azure Cosmos DB för Apache Cassandra

GÄLLER FÖR: Kassandra

API:et för Cassandra i Azure Cosmos DB utnyttjar den underliggande indexeringsinfrastrukturen för att exponera den indexeringsstyrka som ingår i plattformen. Men till skillnad från kärn-API:et för NoSQL indexar API för Cassandra i Azure Cosmos DB inte alla attribut som standard. I stället har den stöd för sekundär indexering för att skapa ett index för vissa attribut, som fungerar på samma sätt som Apache Cassandra.

I allmänhet rekommenderas det inte att köra filterfrågor på de kolumner som inte är partitionerade. Du måste uttryckligen använda TILLÅT FILTRERINGssyntax, vilket resulterar i en åtgärd som kanske inte fungerar bra. I Azure Cosmos DB kan du köra sådana frågor på attribut med låg kardinalitet eftersom de visas över partitioner för att hämta resultatet.

Vi rekommenderar inte att du skapar ett index i en kolumn som uppdateras ofta. Det är klokt att skapa ett index när du definierar tabellen. Detta säkerställer att data och index är i ett konsekvent tillstånd. Om du skapar ett nytt index för befintliga data kan du för närvarande inte spåra indexförloppsändringen för tabellen. Om du behöver spåra förloppet för den här åtgärden måste du begära förloppsändringen via ett supportärende.

Kommentar

Sekundära index kan bara skapas med hjälp av de CQL-kommandon som anges i den här artikeln och inte via resursproviderverktygen (ARM-mallar, Azure CLI, PowerShell eller Terraform). Sekundära index stöds inte på följande objekt:

  • datatyper som frysta samlingstyper, decimaler och varianttyper.
  • Statiska kolumner
  • Klustringsnycklar

Varning

Partitionsnycklar indexeras inte som standard i API för Cassandra. Om du har en sammansatt primärnyckel i tabellen och du filtrerar antingen på partitionsnyckeln och klustringsnyckeln, eller bara partitionsnyckeln, ger detta önskat beteende. Men om du filtrerar på partitionsnyckeln och andra icke-indexerade fält förutom klustringsnyckeln, resulterar detta i en partitionsnyckel, även om de andra icke-indexerade fälten har ett sekundärt index. Om du har en sammansatt primärnyckel i tabellen och vill filtrera på både partitionsnyckelns värdeelement för den sammansatta primärnyckeln, plus ett annat fält som inte är partitionsnyckeln eller klustringsnyckeln, kontrollerar du att du uttryckligen lägger till ett sekundärt index på partitionsnyckeln. Indexet i det här scenariot bör avsevärt förbättra frågeprestanda, även om de andra nyckelfälten som inte är partitioner och nyckelfält som inte är klustringsnyckel inte har något index. Mer information finns i vår artikel om partitionering .

Indexeringsexempel

Skapa först ett exempel på nyckelutrymme och tabell genom att köra följande kommandon i CQL-kommandotolken:

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

Infoga sedan exempelanvändardata med följande kommandon:

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

Om du försöker köra följande instruktion stöter du på ett fel som ber dig att använda ALLOW FILTERING:

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

Även om API:et för Cassandra har stöd för TILLÅT FILTRERING, som du nämnde i föregående avsnitt, rekommenderas det inte. Du bör i stället skapa ett index i det som visas i följande exempel:

CREATE INDEX ON sampleks.t1 (lastname);

När du har skapat ett index i fältet "efternamn" kan du nu köra den tidigare frågan. Med API för Cassandra i Azure Cosmos DB behöver du inte ange ett indexnamn. Ett standardindex med format tablename_columnname_idx används. Är till exempel t1_lastname_idx indexnamnet för den föregående tabellen.

Ta bort indexet

Du måste veta vad indexnamnet är för att släppa indexet. desc schema Kör kommandot för att hämta beskrivningen av tabellen. Utdata för det här kommandot innehåller indexnamnet i formatet CREATE INDEX tablename_columnname_idx ON keyspacename.tablename(columnname). Du kan sedan använda indexnamnet för att släppa indexet enligt följande exempel:

drop index sampleks.t1_lastname_idx;

Nästa steg