it-swarm.com.de

Unterschied zwischen Partitionsschlüssel, zusammengesetztem Schlüssel und Clustering-Schlüssel in Cassandra?

Ich habe Artikel im Internet gelesen, um die Unterschiede zwischen den folgenden key Typen zu verstehen. Aber es scheint mir nur schwer zu begreifen. Beispiele werden definitiv helfen, das Verständnis zu verbessern.

primary key,
partition key, 
composite key 
clustering key
470
brain storm

Das Hinzufügen einer zusammenfassenden Antwort als die akzeptierte ist ziemlich lang. Die Begriffe "Zeile" und "Spalte" werden im Kontext von CQL verwendet, nicht wie Cassandra tatsächlich implementiert wird.

  • Ein Primärschlüssel kennzeichnet eine Zeile eindeutig.
  • Ein zusammengesetzter Schlüssel ist ein Schlüssel, der aus mehreren Spalten besteht.
  • Ein Partitionsschlüssel ist die primäre Suche, um eine Reihe von Zeilen zu finden, d. H. Eine Partition.
  • Ein Clustering-Schlüssel ist der Teil des Primärschlüssels, der nicht der Partitionsschlüssel ist (und definiert die Reihenfolge innerhalb einer Partition).

Beispiele:

  • PRIMARY KEY (a): Der Partitionsschlüssel ist a.
  • PRIMARY KEY (a, b): Der Partitionsschlüssel ist a, der Clustering-Schlüssel ist b.
  • PRIMARY KEY ((a, b)): Der zusammengesetzte Partitionsschlüssel ist (a, b).
  • PRIMARY KEY (a, b, c): Der Partitionsschlüssel ist a, der zusammengesetzte Clustering-Schlüssel ist (b, c).
  • PRIMARY KEY ((a, b), c): Der zusammengesetzte Partitionsschlüssel ist (a, b), der Clustering-Schlüssel ist c.
  • PRIMARY KEY ((a, b), c, d): Der zusammengesetzte Partitionsschlüssel ist (a, b), der zusammengesetzte Clustering-Schlüssel ist (c, d).
102
OrangeDog

In cassandra sorgt der Unterschied zwischen Primärschlüssel, Partitionsschlüssel, zusammengesetztem Schlüssel und Clustering-Schlüssel immer für einige Verwirrung. Deshalb werde ich im Folgenden erklären, wie sie miteinander in Beziehung stehen. Wir verwenden CQL (Cassandra Query Language) für den Cassandra Datenbankzugriff. Hinweis: - Die Antwort entspricht der aktualisierten Version von Cassandra. Primärschlüssel: -

In cassandra gibt es 2 verschiedene Möglichkeiten, Primärschlüssel zu verwenden.

CREATE TABLE Cass (
    id int PRIMARY KEY,
    name text 
);

Create Table Cass (
   id int,
   name text,
   PRIMARY KEY(id) 
);

In CQL spielt die Reihenfolge, in der Spalten für den PRIMARY KEY definiert sind, eine Rolle. Die erste Spalte des Schlüssels wird als Partitionsschlüssel bezeichnet. Sie hat die Eigenschaft, dass alle Zeilen, die denselben Partitionsschlüssel verwenden (sogar tabellenübergreifend), auf demselben physischen Knoten gespeichert sind. Das Einfügen/Aktualisieren/Löschen von Zeilen, die denselben Partitionsschlüssel für eine bestimmte Tabelle verwenden, erfolgt atomar und isoliert. Es ist zu beachten, dass es möglich ist, einen zusammengesetzten Partitionsschlüssel zu haben, d. H. Einen Partitionsschlüssel, der aus mehreren Spalten besteht, wobei ein zusätzlicher Satz von Klammern verwendet wird, um zu definieren, welche Spalten den Partitionsschlüssel bilden.

Partitioning and Clustering Die PRIMARY KEY-Definition besteht aus zwei Teilen: dem Partition Key und den Clustering Columns. Der erste Teil ist dem Zeilenschlüssel der Speicher-Engine zugeordnet, während der zweite Teil zum Gruppieren von Spalten in einer Zeile verwendet wird.

CREATE TABLE device_check (
  device_id   int,
  checked_at  timestamp,
  is_power    boolean,
  is_locked   boolean,
  PRIMARY KEY (device_id, checked_at)
);

Hier ist device_id der Partitionsschlüssel und checked_at der Clusterschlüssel.

Wir können sowohl mehrere Cluster-Schlüssel als auch Partitionsschlüssel haben, was von der Deklaration abhängt.

14
Big Data Guy

Primärschlüssel: Besteht aus Partitionsschlüssel (n) [und optionalen Clustering-Schlüsseln (oder Spalten)]
Partitionsschlüssel: Der Hashwert des Partitionsschlüssels wird verwendet, um den spezifischen Knoten in einem Cluster zum Speichern der Daten zu bestimmen
Clustering Key: Wird verwendet, um die Daten in jeder Partition (oder dem zuständigen Knoten und seinen Replikaten) zu sortieren.

zusammengesetzter Primärschlüssel: Wie oben erwähnt, sind die Clustering-Schlüssel in einem Primärschlüssel optional. Wenn sie nicht erwähnt werden, handelt es sich um einen einfachen Primärschlüssel. Wenn Clustering-Schlüssel erwähnt werden, handelt es sich um einen zusammengesetzten Primärschlüssel.

Composite Partition Key: Wenn Sie nur eine Spalte als Partitionsschlüssel verwenden, kann dies zu Problemen mit breiten Zeilen führen (abhängig vom Anwendungsfall/der Datenmodellierung). Daher wird der Partitionsschlüssel manchmal als Kombination von mehr als einer Spalte angegeben.

In Bezug auf Verwechslungen, von denen eine obligatorisch ist , welche in einer Abfrage übersprungen werden kann usw., versucht stell dir Cassandra als eine riesige HashMap vor hilft. In einer HashMap können Sie die Werte also nicht ohne den Schlüssel abrufen.
Hier spielen die Partitionstasten die Rolle dieser Taste. Für jede Abfrage müssen sie angegeben werden. Ohne welches Cassandra wird nicht wissen, nach welchem ​​Knoten gesucht werden soll.
Die Clustering-Schlüssel (Spalten, die optional sind) helfen bei der weiteren Eingrenzung Ihrer Abfragesuche, nachdem Cassandra den spezifischen Knoten (und seine Repliken) herausgefunden hat, der dafür verantwortlich ist spezifisch Partitionsschlüssel.

8
dd9chndn

Kurz gesagt:

Partitionsschlüssel ist nichts anderes als Identifikation für eine Zeile ist diese Identifikation meistens die einzelne Spalte (genannt Primärschlüssel), manchmal eine Kombination aus mehrere Spalten (genannt Composite Partition Key).

Cluster-Schlüssel ist nichts anderes als Indizierung & Sortierung. Clusterschlüssel hängen von einigen Dingen ab:

  1. Welche Spalten Sie in der where-Klausel mit Ausnahme der Primärschlüsselspalten verwenden.

  2. Wenn Sie sehr große Aufzeichnungen haben, kann ich das Datum für eine einfache Verwaltung aufteilen. Beispiel: Ich habe Daten von 1 Million Einwohnerdatensätzen eines Landkreises. Um die Verwaltung zu vereinfachen, gruppiere ich Daten basierend auf dem Status und nach dem PIN-Code und so weiter.

3
Sun

Bemerkenswert ist, dass Sie diese Lose wahrscheinlich häufiger als in ähnlichen Konzepten in der relationalen Welt (zusammengesetzte Schlüssel) verwenden werden.

Beispiel - Angenommen, Sie müssen die letzten N Benutzer finden, die kürzlich der Benutzergruppe X beigetreten sind. Wie würden Sie dies effizient tun, wenn die Lesevorgänge in diesem Fall überwiegen? So (aus dem offiziellen Cassandra-Führer ):

CREATE TABLE group_join_dates (
    groupname text,
    joined timeuuid,
    join_date text,
    username text,
    email text,
    age int,
    PRIMARY KEY ((groupname, join_date), joined)
) WITH CLUSTERING ORDER BY (joined DESC)

Hier ist der Partitionierungsschlüssel selbst zusammengesetzt und der Clusterungsschlüssel ist ein verbundener Schlüssel Datum. Der Grund, warum ein Clustering-Schlüssel ein Join-Datum ist, ist, dass die Ergebnisse bereits sortiert sind (und gespeichert, was Suchvorgänge schnell macht). Aber warum verwenden wir einen zusammengesetzten Schlüssel für Partitionierungsschlüssel ? Weil wir immer so wenig Partitionen wie möglich lesen wollen . Wie hilft es, join_date dort einzufügen? Jetzt befinden sich Benutzer derselben Gruppe und desselben Beitrittsdatums in einer einzelnen Partition! Das heißt, wir werden immer so wenig Partitionen wie möglich lesen (zuerst mit der neuesten Partition beginnen, dann zu einer älteren wechseln usw., anstatt zwischen ihnen zu springen).

Tatsächlich müssten Sie in extremen Fällen auch den Hash eines join_date anstelle eines join_date alleine verwenden - also wenn Sie fragen nach den letzten 3 Tagen häufig nach, die denselben Hash haben und daher auf derselben Partition verfügbar sind!

0
kboom

Der Primärschlüssel in Cassandra besteht normalerweise aus zwei Teilen - Partitionsschlüssel und Clustering-Spalten.

primary_key ((partition_key), clustering_col)

Partitionsschlüssel - Der erste Teil des Primärschlüssels. Das Hauptziel eines Partitionsschlüssels besteht darin, den Knoten zu identifizieren, der die bestimmte Zeile speichert.

TABELLE ERSTELLEN phone_book (phone_num int, name text, age int, city text, PRIMARY KEY ((phone_num, name), age);

Hier ist (phone_num, name) der Partitionsschlüssel. Beim Einfügen der Daten wird der Hash-Wert des Partitionsschlüssels generiert und dieser Wert entscheidet, in welchen Knoten die Zeile eingefügt werden soll.

Stellen Sie sich einen Cluster mit 4 Knoten vor, jeder Knoten verfügt über einen Bereich von Hashwerten, die er speichern kann. (Schreiben) INSERT IN phone_book VALUES (7826573732, "Joey", 25, "New York");

Nun wird der Hash-Wert des Partitionsschlüssels vom Partitionierer Cassandra berechnet. Sagen wir, Hash-Wert (7826573732, 'Joey') → 12, jetzt wird diese Zeile in Node C eingefügt.

(Lesen) SELECT * FROM phone_book WHERE phone_num = 7826573732 und name = ’Joey’;

Nun wird wieder der Hash-Wert des Partitionsschlüssels (7826573732, "Joey") berechnet, der in unserem Fall 12 ist und sich in Node C befindet, von dem der Lesevorgang erfolgt.

  1. Spalten gruppieren - Zweiter Teil des Primärschlüssels. Der Hauptzweck von Clustering-Spalten besteht darin, die Daten in einer sortierten Reihenfolge zu speichern. Standardmäßig ist die Reihenfolge aufsteigend.

In einem Primärschlüssel können je nach der von Ihnen gelösten Abfrage mehrere Partitionsschlüssel und Clusterspalten vorhanden sein.

primärschlüssel ((pk1, pk2), Spalte 1, Spalte 2)

0
Sumon Saikan