2015-05-27 21 views
5

Ich bin gerade dabei, Cassandra zu starten, und ich habe versucht, Tabellen mit verschiedenen Partition und Clustering-Schlüssel zu erstellen, um zu sehen, wie sie anders abgefragt werden können.Cassandra - Fragen über Clustering-Schlüssel

Ich erstellte eine Tabelle mit Primärschlüssel der Form - (a), b, c, wobei a der Partitionsschlüssel und b, c Clustering-Schlüssel sind.

Beim Abfragen bemerkte ich, dass die folgende Abfrage:

select * from tablename where b=val; 

Ergebnisse in:

Kann diese Abfrage nicht ausführen, da es möglicherweise die Datenfilterung beinhaltet und somit kann unvorhersehbare Leistung hat. Wenn Sie diese Abfrage trotz der Leistung Unberechenbarkeit ausführen möchten, erlauben den Einsatz FILTERING

Und mit „LASSEN Filtering“ wird mir, was ich will (auch wenn ich seine schlecht für die Leistung gehört habe).

Aber wenn ich die folgende Abfrage:

select * from tablename where c=val; 

Dort heißt es:

PRIMARY KEY-Spalte "c" kann nicht eingeschränkt werden (vorhergehenden Spalte "b" ist entweder nicht eingeschränkt oder durch eine Nicht-EQ-Beziehung)

Und es gibt keine "ALLOW FILTERING" -Option überhaupt.

MEINE FRAGE IST - Warum werden alle Clustering-Schlüssel nicht gleich behandelt? Spalte b, die an den Partitionsschlüssel 'a' angrenzt, hat die Option 'Filterung erlauben', die eine Abfrage erlaubt, während die Abfrage der Spalte 'c' überhaupt nicht möglich erscheint (angesichts der Anordnung dieser Tabelle).

ALLOW FILTERING erhält Cassandra, um durch alle SSTables zu scannen und die Daten herauszuholen, wenn der Partitionsschlüssel fehlt, warum können wir dann nicht dieselbe Spalte c machen?

Antwort

9

Es ist nicht so, dass Clustering-Schlüssel nicht gleich behandelt werden, sondern dass sie nicht übersprungen werden können. Dies liegt daran, dass Cassandra die Clusterschlüssel verwendet, um die Sortierreihenfolge auf der Festplatte innerhalb einer Partition zu bestimmen.

Fügen Sie zu Ihrem Beispiel PRIMARY KEY ((a),b,c,d) hinzu. Sie können Ihre Abfrage (mit ALLOW FILTERING) ausführen, indem Sie nur b oder b und c angeben. Aber Sie können nicht c und d (überspringt b) oder b und d (überspringt c) angeben.

Und als ein Seitenknoten, wenn Sie wirklich in der Lage sein möchten, nur durch b oder nur c abzufragen, dann sollten Sie diese Abfragen mit zusätzlichen Tabellen unterstützen, die als solche ausgelegt sind. ALLOW FILTERING ist ein Pflaster und sollte bei einer Cassandra-Produktion nicht verwendet werden.

+1

Danke, das hilft definitiv zu verstehen, wie Cassandra funktioniert! – user3376961