Sekundäre Indizierung in Azure Cosmos DB for Apache Cassandra

GILT FÜR: Cassandra

Der API für Cassandra in Azure Cosmos DB nutzt die zugrunde liegende Indizierungsinfrastruktur, um die Indizierungsstärke bereitzustellen, die der Plattform eigen ist. Im Gegensatz zur Kern-API für NoSQL indiziert die API für Cassandra in Azure Cosmos DB jedoch nicht standardmäßig alle Attribute. Stattdessen wird sekundäre Indizierung unterstützt, um einen Index für bestimmte Attribute zu erstellen. Dieses Verhalten ist mit Apache Cassandra identisch.

Im Allgemeinen ist es nicht ratsam, Filterabfragen für die Spalten auszuführen, die nicht partitioniert sind. Sie müssen explizit ALLOW FILTERING-Syntax verwenden, was zu einem Vorgang führt, dessen Leistung möglicherweise schlecht ist. In Azure Cosmos DB können Sie solche Abfragen für Attribute mit niedriger Kardinalität ausführen, da sie über Partitionen hinweg aufgefächert werden, um die Ergebnisse abzurufen.

Es wird nicht empfohlen, einen Index für eine häufig aktualisierte Spalte zu erstellen. Es ist ratsam, einen Index zu erstellen, wenn Sie die Tabelle definieren. Dadurch wird sichergestellt, dass sich Daten und Indizes in einem konsistenten Zustand befinden. Wenn Sie für die vorhandenen Daten einen neuen Index erstellen, können Sie den Fortschritt der Indexänderung für die Tabelle zurzeit nicht nachverfolgen. Wenn Sie den Fortschritt für diesen Vorgang nachverfolgen müssen, müssen Sie die Fortschrittsänderung über ein Supportticket anfordern.

Hinweis

Sekundäre Indizes können nur mithilfe der in diesem Artikel genannten CQL-Befehle und nicht über die Ressourcenanbieter-Hilfsprogramme (ARM-Vorlagen, Azure CLI, PowerShell oder Terraform) erstellt werden. Sekundäre Indizes werden für die folgenden Objekte nicht unterstützt:

  • Datentypen wie fixierte Sammlungstypen, Dezimal- und Variant-Typen.
  • Statische Spalten
  • Clusteringschlüssel

Warnung

Partitionsschlüssel werden in der API für Cassandra nicht standardmäßig indiziert. Wenn Ihre Tabelle einen zusammengesetzten Primärschlüssel enthält und Sie entweder nach Partitionsschlüssel und Clusterschlüssel oder nur nach Partitionsschlüssel filtern, erzielen Sie damit das gewünschte Verhalten. Wenn Sie jedoch nach Partitionsschlüssel und anderen nicht indizierten Feldern (abgesehen vom Clusterschlüssel) filtern, führt dies zu einer Partitionsschlüsselauffächerung, auch wenn die anderen nicht indizierten Felder über einen sekundären Index verfügen. Wenn Sie einen zusammengesetzten Primärschlüssel in Ihrer Tabelle verwenden und nach dem Wertelement des Partitionsschlüssels des zusammengesetzten Primärschlüssels sowie einem anderen Feld filtern möchten, das nicht den Partitionsschlüssel oder Clusterschlüssel enthält, stellen Sie sicher, dass Sie explizit einen sekundären Index für den Partitionsschlüssel hinzufügen. Der Index in diesem Szenario sollte die Abfrageleistung erheblich verbessern, auch wenn die anderen Felder ohne Partitions- oder Clusterschlüssel keinen Index aufweisen. Weitere Informationen finden Sie im Artikel zur Partitionierung.

Indizierungsbeispiel

Erstellen Sie zunächst einen Beispielkeyspace und eine Beispieltabelle, indem Sie die folgenden Befehle an der Eingabeaufforderung der CQL-Shell ausführen:

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

Fügen Sie dann Beispielbenutzerdaten mit den folgenden Befehlen ein:

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

Wenn Sie versuchen, die folgende Anweisung auszuführen, tritt ein Fehler auf, bei dem Sie aufgefordert werden, ALLOW FILTERING zu verwenden:

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

Obwohl die API für Cassandra ALLOW FILTERING unterstützt (wie im vorherigen Abschnitt erwähnt), wird dies nicht empfohlen. Sie sollten stattdessen einen Index wie im folgenden Beispiel gezeigt erstellen:

CREATE INDEX ON sampleks.t1 (lastname);

Nachdem Sie einen Index für das Feld „lastname“ erstellt haben, können Sie die vorherige Abfrage jetzt erfolgreich ausführen. Bei der API für Cassandra in Azure Cosmos DB müssen Sie keinen Indexnamen angeben. Es wird ein Standardindex mit dem Format tablename_columnname_idx verwendet. Beispielsweise ist t1_lastname_idx der Indexname der vorherigen Tabelle.

Löschen des Indexes

Sie müssen wissen, wie der Indexname lautet, um den Index zu löschen. Führen Sie den Befehl desc schema aus, um die Beschreibung der Tabelle abzurufen. Die Ausgabe dieses Befehls enthält den Indexnamen im Format CREATE INDEX tablename_columnname_idx ON keyspacename.tablename(columnname). Sie können den Indexnamen dann verwenden, um den Index zu löschen, wie im folgenden Beispiel gezeigt:

drop index sampleks.t1_lastname_idx;

Nächste Schritte