2014-07-25 6 views
5

betrachten Sie dieses Beispiel:Was macht `create index` in Cassandra-Tabellen?

create table bite (
     id varchar PRIMARY KEY, 
     feedid varchar, 
     score bigint, 
     data varchar 
); 

create index bite_feedid on bite (feedid); 
create index bite_score on bite (score); 

Ich bin nicht sicher, was die letzten beiden Zeilen create index.. tun? Warum ist es wichtig? Erstellt es eine neue Tabelle? Wenn ja, wie kann ich damit nachschlagen?

Dank

Antwort

6

Ein sekundärer Index erstellt eine neue Tabelle mit der indizierten Spalte als Primärschlüssel. Die Vorteile dieses Ansatzes bestehen darin, dass Ihre Schreib-/Löschvorgänge für eine Tabelle automatisch in mehrere Operationen umgewandelt werden, ohne dass Sie sich darum kümmern müssen. Jetzt, da Cassandra Chargen unterstützt, scheint das kein großer Vorteil zu sein, aber in Cassandra 0.7 ... 1.1 war ein großes Zeug.

Sekundärindizes sollten nicht verwendet werden, wenn die Abfrage im Index immer ein Ergebnis liefert (z. B. Sekundärindex auf UUID setzen).

Eine gute Eigenschaft von s.i. Sie können eine einzelne Spalte abfragen, ohne etwas vom Primärschlüssel zu wissen, und einen Teil des Primärschlüssels mit einem Sekundärindex kombinieren (mit Hilfe des AND-Operators).

Sie können die WHERE-Klausel nicht mit mehreren in AND kombinierten Sekundärindizes ausführen.

HTH, Carlo

+0

können Sie mit diesem helfen: http://stackoverflow.com/questions/ 24964673/unable-to-start-cqlsh-in-mac-os-x – eagertoLearn

+0

erledigt :) check it –

+0

können Sie ein Beispiel geben, um diesen Punkt zu verdeutlichen: Sekundäre Indizes sollten nicht verwendet werden, wenn die Abfrage im Index immer eins abruft Ergebnis (zB: Sekundärindex auf eine UUID setzen). – eagertoLearn

2

normalerweise in traditionellen Datenbanken-Index erstellt wird eine Datenstruktur zum Beispiel verwenden sagen HashMap, deren Schlüssel wird die indizierte Spalte und die Wertepunkte der tatsächlichen Zeile in der Tabelle sein. Damit kann die Abfrage Ergebnisse basierend auf dem Indexschlüssel in ungefähr O (1) abrufen.

Wie wird der Index erstellt? Jeder Schlüssel in der indizierten Spalte wird mit einer Hash-Funktion gehashed, die einen Wert zurückgibt und als Index verwendet wird.

In Cassandra-Datenbank, da die Daten (dh) eine bestimmte Spalte selbst verteilt ist, verwendet es spezielle Mechanismus, um die obige Indizierung zu erreichen.

Indexierung bedeutet schnelles Abrufen oder schnelles Lesen. Aber die Einschränkung ist zu viel Indizierung führt auch zu seinen schlechten Dingen wie Kollisionen in den indizierten Tasten.

+0

ist der Index ein weiterer Tisch? Wenn es Datenstruktur wie HashMap, muss es irgendwo gespeichert werden, um nachzuschlagen? Wie würde man darauf zugreifen? Kannst du ein Beispiel geben? – eagertoLearn

+0

Ja, der Index ist eine andere Tabelle. Sie können auf alle Indizes aus dem Systemschlüsselbereich zugreifen. Ich habe kein Beispiel. Aber das würde Ihnen wirklich helfen http://stackoverflow.com/questions/21092524/cassandra-2-list-existing-indexes-with-cql-3 – rozar

5

create index erstellt einen sekundären Index für die Tabelle. In Cassandra werden Daten in Partitionen über Knoten hinweg gespeichert - eine Partition entspricht einem Partitionsschlüssel - der der erste Schlüssel des Primärschlüssels ist. Verbleibende Schlüssel im Primärschlüssel bilden die Clustering-Schlüssel. Zum Beispiel hatte, wenn Sie die folgenden Schritte aus:

CREATE TABLE foo.people ( id int, name text, Alter int, Job Text, PRIMARY KEY (id, name, Job) )

ID wäre der Partitionsschlüssel, und Name und Job wären die Clustering-Schlüssel.

Daten in einer Partition werden in der Reihenfolge der Clustering-Schlüssel gespeichert. Bei der Abfrage mit Filtern geben Sie einen Partitionsschlüssel an, und Sie können dann basierend auf Clustering-Schlüsseln filtern. Für mehrere Clustering-Schlüssel müssen Sie vorheriges Clustering angeben, um ein bestimmtes zu verwenden. Zum Beispiel in dem Szenario erwähnt, können Sie tun

wo id = 2 und name = 'John' und Job = 'dev' oder wo id = 2 und name = 'John'

aber nicht Wobei id = 2 und job = 'dev' als Name vor dem Job im Clustering-Schlüssel erscheint.

Sie können keinen Filter für das Alter erstellen, da dieser nicht Teil eines Schlüssels ist. Dies ist, wo der sekundäre Index kommt. Wenn Sie dann tun: erstellen Index Blabla auf Menschen (Alter)

Sie können dies tun: wählen * von Menschen, wo Alter = 45;

Dies kann möglicherweise teuer sein, da es über Ihren Cluster abfragen wird. Folgendes kann jedoch effizient sein: Wählen Sie * aus Personen mit ID = 2 und Alter = 45;

Dies ist nützlich für Zeitreihen oder andere breite Zeilenformate.

Abfragen auf Sekundärindizes sind restriktiv - Sie können beispielsweise keine Bereichsabfragen durchführen - Sie sind auf = checks beschränkt.

Sekundärindizes in Cassandra können Ihnen die mühselige Pflege von Indextabellen ersparen und sind effizienter, als wenn Sie dies manuell getan hätten. Sie sind schließlich konsistent (Ihre Schreibvorgänge warten nicht darauf, dass Indizes aktualisiert werden, um zum Erfolg zurückzukehren), und derzeit werden Indexinformationen für die Daten eines Knotens lokal gespeichert.

Zuletzt können Sie die aktuell vorhandenen Indizes aus der Tabelle "IndexInfo" im Systemschlüsselbereich finden.

Hoffe, dass hilft.