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

GÄLLER FÖR: Cassandra

API:et för Cassandra i Azure Cosmos DB utnyttjar den underliggande indexeringsinfrastrukturen för att exponera indexeringsstyrkan som är inbyggd 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 stöder den 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 förgrenas över partitioner för att hämta resultatet.

Vi rekommenderar inte att du skapar ett index för 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örloppet 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 en supportbegäran.

Anteckning

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

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

Varning

Partitionsnycklar indexeras inte som standard i API:et 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 att partitionsnyckeln tas bort – även om de andra icke-indexerade fälten har ett sekundärt index. Om du har en sammansatt primärnyckel i tabellen och du 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 partitionsnycklar och icke-klustringsnycklar 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 får du ett felmeddelande där du uppmanas 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 nämnts i föregående avsnitt, rekommenderas det inte. Du bör i stället skapa ett index i som du ser i följande exempel:

CREATE INDEX ON sampleks.t1 (lastname);

När du har skapat ett index i fältet "lastname" 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 föregående tabell.

Ta bort indexet

Du måste veta vad indexnamnet är för att ta bort indexet. desc schema Kör kommandot för att hämta beskrivningen av tabellen. Utdata från 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 ta bort indexet enligt följande exempel:

drop index sampleks.t1_lastname_idx;

Nästa steg