2016-07-07 9 views
0

Ich versuche letzten aktiven Sensoren dieses Schema zu speichern und abzurufen:Wie ich in Bereichsabfragen weiß, ruft Cassandra das Ergebnis nach dem Culstring-Schlüssel ab. Kann ich dieses Verhalten in meiner Abfrage ändern?

CREATE TABLE last_signals (
    section bigint, 
    sensor bigint, 
    time bigint, 
    PRIMARY KEY (section, sensor) 
); 

Zeile dieser Tabelle wird alle paar Sekunden aktualisiert werden und in der Folge heißen Sensoren werden in memtable bleiben. Aber was passiert, wenn ich einen Laufe eine Abfrage wie folgt erhalten:

SELECT * FROM last_signals 
    WHERE section = ? AND time > ? 
    Limit ? 
    ALLOW FILTERING; 

Und das Ergebnis wird in etwa so (durch Clustering-Schlüssel bestellt) sein:

sect | sens | time 
------+------+------ 
    1 | 1 | 4 
    1 | 2 | 3 
    1 | 4 | 2 
    1 | 5 | 9 

Die erste Frage: Ist das Ergebnis garantiert in allen Versionen gleich zu sein? (Ich verwende 3,7) und der nächste ist, wie ich dieses Verhalten ändern kann (mit Abfrage-Option, Modellierung oder etc.). Tatsächlich muss ich die letzten Schreibvorgänge zuerst ohne Berücksichtigung der Befehlstastenreihenfolge durchführen. Ich denke in diesem Fall wird mein Lesen viel schneller sein.

+0

Cassandra ist nicht sehr gut an Updates, die jeweils Update Blätter ein Tombstone bis zur nächsten Komprimierung, und wenn es viele von ihnen gibt, kann die Leseleistung beeinträchtigt sein, da sie sie durchforsten muss. Sie werden wahrscheinlich eine Änderung des Schemas in Betracht ziehen müssen, aber zuerst können Sie sagen, wie viele Abschnitte und Sensoren Sie maximal haben werden? – yurgis

+0

@yurgis Ja, du hast Recht, aber ich habe darüber nachgedacht und werde die Layered-Komprimierung als Speicher-Engine verwenden. Außerdem konfiguriere ich meine Memtable-Größe, um alle heißen Sensoren in memtable zu behalten, und dann haben Updates keine großen Kosten für die Komprimierung. Ich werde Hunderte Sensoren pro Sektion und Millionen von Sektionen haben; aber ich habe ungefähr zehn heiße Sensoren pro Abschnitt, die in jeder Minute aktualisiert werden müssen. –

Antwort

1

Ich glaube nicht, dass es eine Möglichkeit gibt, neben der Verwendung von Clustering-Schlüsseln Ordnung zu gewährleisten. Daher ist Ihre ALLOW FILTERING-Abfrage möglicherweise kostspielig und kann sogar eine Zeitüberschreitung verursachen. Sie könnten das folgende Schema betrachten:

CREATE TABLE last_signals_by_time (
    section bigint, 
    sensor bigint, 
    time bigint, 
    dummy bool, 
    PRIMARY KEY ((section, sensor), time) 
) WITH CLUSTERING ORDER BY (time DESC); 

Statt Updates tun Einsätze mit TTL, so dass Sie müssen manuell alte Einträge nicht aufzuräumen. (Das Dummy-Feld ist erforderlich, um für TTL zu arbeiten)

Und dann führen Sie einfach Ihre Lese Abfragen pro Abschnitt/Sensoren in parallel:

SELECT * FROM last_signals_by_time 
    WHERE section = ? AND sensor = ? 
    LIMIT 1;