Einfach ausgedrückt, erzwingt Cassandra nur die Sortierreihenfolge innerhalb einen Partitionsschlüssel.
PRIMARY KEY (layer_name, layer_position)
) WITH CLUSTERING ORDER BY (layer_position DESC)
In diesem Fall layer_name
ist die Partition Schlüssel. Wenn Sie in Ihrer WHERE-Klausel layer_name
angeben, werden Ihre Ergebnisse für diesen Wert layer_name
von layer_position
bestellt.
SELECT * FROM layer WHERE layer_name = 'layer1';
Sie müssen ORDER BY nicht angeben. Alles, was ORDER BY wirklich tun kann, ist eine Sortierrichtung (aufsteigend oder absteigend).
Cassandra funktioniert auf diese Weise, weil es Daten in der Reihenfolge sortiert, in der es auf der Festplatte sortiert ist. Ihre Partitionsschlüssel sind nach Hash-Token-Werten sortiert, weshalb die Ergebnisse einer ungebundenen WHERE-Klausel zufällig geordnet erscheinen.
EDIT
Ich habe Daten state_id
Spalte holen verwenden und es sollte durch layer_position
sein Auftrag.
Cassandra-Tabellen sind für eine bestimmte Abfrage optimiert. Während dies zu einer hohen Leistungsfähigkeit führt, besteht der Nachteil darin, dass die Abfrageflexibilität begrenzt ist. Der Weg, dies zu lösen, besteht darin, Ihre Daten in eine zusätzliche Tabelle zu duplizieren, die speziell für diese Abfrage entwickelt wurde.
CREATE TABLE layer_by_state_id (
layer_name text,
layer_position text,
state_id text,
PRIMARY KEY (state_id, layer_position, layer_name)
) WITH CLUSTERING ORDER BY (layer_position DESC, layer_name ASC);
Diese Tabelle wird wie folgt ermöglichen, Abfragen zu arbeiten:
wird
SELECT * FROM layer WHERE state_id='thx1138';
Und die Ergebnisse von layer_position
, state_id
innerhalb der gewünschten sortiert werden.
Jetzt mache ich ein paar Annahmen, die Sie untersuchen wollen:
- ich davon aus, dass mir
state_id
ein guter Partitionierungsschlüssel ist. Das bedeutet, dass die Kardinalität hoch genug ist, um eine gute Verteilung im Cluster zu ermöglichen, aber die Kardinalität niedrig genug ist, dass genügend CQL-Zeilen zurückgegeben werden, damit sich die Sortierung lohnt.
- Ich gehe davon aus, dass die Kombination
state_id
und layer_position
nicht genug ist, um jede Zeile eindeutig zu identifizieren. Daher stelle ich die Eindeutigkeit sicher, indem ich layer_name
als zusätzlichen Clustering-Schlüssel hinzufüge. Du kannst es vielleicht oder auch nicht brauchen, aber ich vermute, dass du es tust.
- Ich gehe davon aus, dass die Verwendung von
state_id
als Partitionierungsschlüssel kein ungebundenes Wachstum zeigen wird, um Cassandras Grenze von 2 Milliarden Zellen pro Partition zu erreichen. Wenn dies der Fall ist, müssen Sie möglicherweise eine zusätzliche Partition "Bucket" hinzufügen.
Vielleicht hilft Ihnen das: - http://www.planetcassandra.org/blog/cql-cassandra-query-language/ – Hemdip
danke, aber ich habe das auch versucht, aber es kann nicht funktionieren. –
Wenn ich versuche, Reihenfolge zu verwenden, dann gibt es einen Fehler wie: ORDER BY wird nur unterstützt, wenn der Partitionsschlüssel durch einen EQ oder einen IN eingeschränkt ist. aber ich bekomme dieses Problem nicht. –