Cassandra Abfragesprache (CQL): Einfügen, Aktualisieren und Löschen

⚡ Intelligente Zusammenfassung

Cassandra Die Abfragesprache verarbeitet Einfüge-, Aktualisierungs-, Lösch- und Leseoperationen mit einer Syntax, die SQL ähnelt, aber eine andere Semantik aufweist. Diese Seite behandelt jede Anweisung, das Upsert-Verhalten, das Einfüge- und Aktualisierungsoperationen zusammenfasst, sowie die tatsächlichen Grenzen der WHERE-Klausel.

  • Verhalten einfügen: Lediglich der Primärschlüssel ist obligatorisch, ausgelassene Spalten belegen keinen Speicherplatz.
  • 🔄 Upsert-Semantik: Einfügen und Aktualisieren sind die gleiche Operation, daher wird beim Schreiben eines vorhandenen Schlüssels dieser stillschweigend überschrieben.
  • 🗑️ Löschkosten: Entfernte Reihen werden zu Grabsteinen und verschwinden erst nach Verdichtungsvorgängen.
  • 🔍 Where-Klausel Grenzen: Die Filterung funktioniert auf Primärschlüsselspalten oder, sobald ein Index vorhanden ist, auf anderen Spalten.
  • 📊 Gesamtunterstützung: ANZAHL, MIN, MAX, SUMME AVG GROUP BY und GROUP BY werden unterstützt, allerdings nur effizient innerhalb einer Partition.
  • 🚫 Noch immer nicht unterstützt: Joins, OR-Bedingungen und partitionsübergreifende Analysen bleiben von vornherein außerhalb von CQL.

Cassandra CQL Einfügen Aktualisieren Löschen

Daten einfügen

Das Cassandra insert-Anweisung schreibt Daten hinein Cassandra Spalten in Zeilenform. Cassandra Die Einfügeabfrage speichert nur die vom Benutzer angegebenen Spalten. Sie müssen unbedingt nur die Primärschlüsselspalte angeben.

Es wird kein Platz für nicht angegebene Werte benötigt. Nach dem Einfügen werden keine Ergebnisse zurückgegeben.

Syntax

INSERT INTO KeyspaceName.TableName (ColumnName1, ColumnName2, ColumnName3)
VALUES (Column1Value, Column2Value, Column3Value);

Beispiel

Hier ist der Schnappschuss der Hingerichteten Cassandra Abfrage zum Einfügen in eine Tabelle, in die ein Datensatz eingefügt wird Cassandra Tabelle „Student“.

Daten einfügen

INSERT INTO University.Student (RollNo, Name, dept, Semester)
VALUES (2, 'Michael', 'CS', 2);

Nach erfolgreicher Ausführung des Befehls Einfügen in Cassandra, wird eine Zeile in die eingefügt Cassandra Tabelle Student mit RollenNr. 2, Name Michael, Abteilung CS und Semester 2.

Hier ist die Momentaufnahme des aktuellen Datenbankstatus.

Daten einfügen

Daten hochladen

Cassandra stört. Upsert bedeutet das Cassandra fügt eine Zeile ein, wenn noch kein Primärschlüssel vorhanden ist, andernfalls wird die Zeile aktualisiert, wenn bereits ein Primärschlüssel vorhanden ist.

Dies hat eine praktische Konsequenz, die es wert ist, deutlich erwähnt zu werden: Ein INSERT-Befehl meldet niemals einen Fehler wegen doppelter Schlüssel. Daher überschreibt ein versehentliches erneutes Einfügen die bestehende Zeile ohne Warnung. Um dies zu verhindern, fügen Sie IF NOT EXISTS hinzu, um die Anweisung zu einer schlanken Transaktion zu machen.

INSERT INTO University.Student (RollNo, Name)
VALUES (2, 'Michael') IF NOT EXISTS;

Lightweight-Transaktionen nutzen eine Konsensrunde über Replikate hinweg, sind daher deutlich langsamer als normale Schreibvorgänge und sollten Fällen vorbehalten bleiben, in denen die Überprüfung wirklich notwendig ist.

Daten aktualisieren

Das Cassandra Die Aktualisierungsabfrage wird verwendet, um die Daten im zu aktualisieren Cassandra Tabelle. Wenn nach dem Aktualisieren der Daten keine Ergebnisse zurückgegeben werden, bedeutet dies, dass die Daten erfolgreich aktualisiert wurden. Andernfalls wird ein Fehler zurückgegeben. Spaltenwerte werden in der Klausel „Set“ geändert, während die Daten mit der Klausel „Where“ gefiltert werden.

Syntax

UPDATE KeyspaceName.TableName
SET ColumnName1 = NewValue1,
    ColumnName2 = NewValue2
WHERE ColumnName = ColumnValue;

Beispiel

Hier ist der Screenshot, der den Datenbankstatus vor der Aktualisierung der Daten zeigt.

Daten aktualisieren

Hier ist der Schnappschuss der Hingerichteten Cassandra Update-Befehl, der den Datensatz in der Student-Tabelle aktualisiert.

Daten aktualisieren

UPDATE University.Student
SET name = 'Hayden'
WHERE rollno = 1;

Nach erfolgreicher Ausführung der Update-Abfrage in Cassandra „Student aktualisieren“, der Name des Studenten wird von „Clark“ in „Hayden“ mit Rollennummer 1 geändert.

Hier ist der Screenshot, der den Datenbankstatus nach der Aktualisierung der Daten zeigt.

Daten aktualisieren

Aufgrund des Upsert-Verhaltens wird bei einem UPDATE-Befehl für einen nicht existierenden Primärschlüssel die Zeile erstellt, anstatt dass ein Fehler auftritt.

Cassandra Daten löschen

Der Befehl „Löschen“ entfernt eine ganze Zeile oder einige Spalten aus der Tabelle Student. Wenn Daten gelöscht werden, werden sie nicht sofort aus der Tabelle gelöscht. Stattdessen werden gelöschte Daten mit einem Tombstone markiert und nach der Komprimierung entfernt.

Syntax

DELETE FROM KeyspaceName.TableName
WHERE ColumnName1 = ColumnValue;

Die obige Cassandra Die Syntax zum Löschen von Zeilen löscht eine oder mehrere Zeilen, abhängig von der Datenfilterung in der Where-Klausel.

DELETE ColumnName1, ColumnName2 FROM KeyspaceName.TableName
WHERE ColumnName1 = ColumnValue;

Die obige Syntax löscht einige Spalten aus der Tabelle.

Beispiel

Hier ist der Snapshot, der den aktuellen Datenbankstatus vor dem Löschen von Daten zeigt.

Cassandra Daten löschen

Hier ist die Momentaufnahme des Befehls, der eine Zeile aus der Tabelle „Student“ entfernt.

Cassandra Daten löschen

DELETE FROM University.Student WHERE rollno = 1;

Nach erfolgreicher Ausführung des CQL-Befehls Delete wird eine Zeile aus der Tabelle Student gelöscht, in der die Rollnummer den Wert 1 hat.

Hier ist der Snapshot, der den Datenbankstatus nach dem Löschen von Daten zeigt.

Cassandra Daten löschen

Tombstones bleiben für gc_grace_seconds (standardmäßig zehn Tage) erhalten, sodass ein Knoten, der während des Löschvorgangs offline war, die Zeile nach seiner Rückkehr nicht wiederherstellen kann. Das Löschen großer Datenmengen hinterlässt daher Markierungen, die bei jedem nachfolgenden Lesevorgang übersprungen werden müssen.

Was Cassandra nicht unterstützt

CQL übernimmt zwar die SQL-Syntax, aber nicht das relationale Ausführungsmodell, weshalb sich einige bekannte Konstrukte anders verhalten oder fehlen.

  1. CQL unterstützt keine Joins zwischen Tabellen. Zusammengehörige Daten müssen beim Schreiben in eine einzige Tabelle denormalisiert werden.
  2. CQL unterstützt keine OR-Bedingungen in einer WHERE-Klausel. Verwenden Sie IN für eine einzelne Spalte oder führen Sie separate Abfragen aus.
  3. CQL unterstützt weder UNION noch INTERSECT.
  4. Nicht-Primärschlüsselspalten können erst gefiltert werden, wenn ein Index für sie existiert.
  5. Die Vergleiche „größer als“ und „kleiner als“ gelten nur für Clusterspalten, da nur diese auf der Festplatte sortiert sind.
  6. Die Mustererkennung mit LIKE erfordert einen SASI-Index und ist für normale Spalten nicht verfügbar.

Eine seit langem bestehende Behauptung muss korrigiert werden. Aggregatfunktionen werden unterstützt: ANZAHL, MIN, MAX, SUMME und AVG angekommen in Cassandra 2.2 und GRUPPIERE NACH Eingetroffen in Version 3.10. Der Haken liegt eher im Umfang als in der Verfügbarkeit.

SELECT dept, COUNT(*) FROM University.Student
WHERE RollNo = 1 GROUP BY dept;

Beschränkt man sich wie oben beschrieben auf eine einzelne Partition, ist eine Aggregation effizient. Wird sie jedoch über die gesamte Tabelle ausgeführt, führt sie zu einem clusterweiten Scan, weshalb Cassandra bleibt für Ad-hoc-Analysen ungeeignet und deshalb wird die umfangreiche Berichterstellung normalerweise auf andere Bereiche verlagert. Spark oder ein externes Lager.

Cassandra Where-Klausel

In CassandraDer Datenabruf ist ein heikles Thema. Die Spalte wird eingefiltert Cassandra durch Erstellen eines Index für Nicht-Primärschlüsselspalten.

Syntax

SELECT ColumnNames FROM KeyspaceName.TableName
WHERE ColumnName1 = Column1Value
  AND ColumnName2 = Column2Value;

Beispiel

  • Hier ist der Schnappschuss, der den Datenabruf aus der Student-Tabelle ohne Datenfilterung zeigt.

Cassandra Where-Klausel

SELECT * FROM University.Student;

Zwei Datensätze werden aus der Student-Tabelle abgerufen.

  • Hier ist der Schnappschuss, der den Datenabruf von Student mit Datenfilterung zeigt. Ein Datensatz wird abgerufen.

Die Daten werden anhand der Namensspalte gefiltert. Es werden alle Datensätze abgerufen, deren Name dem angegebenen Wert entspricht. Guru99

Cassandra Where-Klausel

SELECT * FROM University.Student WHERE name = 'Guru99';

Die Regeln, welche Spalten eine WHERE-Klausel referenzieren darf, leiten sich direkt vom Primärschlüssel ab.

  • Das Partitionsschlüssel Für eine effiziente Abfrage muss der vollständige Parameter angegeben werden, da er den Knoten identifiziert, der die Daten enthält.
  • ClusterSpalten Sie können dann eingeschränkt werden, aber nur in der Reihenfolge ihrer Deklaration. Überspringenping Eine wird abgelehnt.
  • Bereichsvergleiche sind nur für die zuletzt referenzierte Clusterspalte zulässig, nicht für frühere.
  • Jedes andere Spalte benötigt einen Sekundärindex, der im Folgenden behandelt wird Index erstellen und löschen Tutorial.

Wenn eine Anfrage abgelehnt wird, Cassandra Oft wird vorgeschlagen, ALLOW FILTERING anzuhängen. Betrachten Sie dies eher als Warnung denn als Lösung: Es durchsucht jede Partition auf jedem Knoten, und eine Schemaänderung ist fast immer die richtige Reaktion.

Häufig gestellte Fragen

Ein Batch gruppiert Anweisungen, sodass sie gemeinsam erfolgreich sind oder fehlschlagen. Verwenden Sie ihn, um doppelte Tabellen synchron zu halten, nicht jedoch für das Massenladen, da ein Batch über viele Partitionen den Koordinator stark verlangsamt.

Treiberseiten werden automatisch mithilfe eines Paging-Status-Tokens bereitgestellt. In cqlsh legt PAGING die Größe fest. Vermeiden Sie die Emulation von OFFSET mit einem Zähler, da Cassandra hat keine effiziente Zeilenüberspringungping Mechanismus.

Wenn eine Replik länger als gc_grace_seconds ausgefallen war und der Tombstone bereits komprimiert wurde, behält diese Replik die alte Zeile bei und verteilt sie wieder. Regelmäßige Reparaturen verhindern dies.

Einfache Abfragen einzelner Tabellen lassen sich gut konvertieren. Für Abfragen mit Joins, OR-Verknüpfungen oder Unterabfragen gibt es kein direktes CQL-Äquivalent, und KI versucht diese Lücke oft mit ALLOW FILTERING zu überbrücken, was jedoch keine Lösung darstellt.

Ja. Einfügen TRACDie Ausgabe von ING ON liefert in der Regel ein klares Bild von Tombstone-Scans, breiten Partitionen oder Knotenübergreifenden Hops. Überprüfen Sie die vorgeschlagene Schemaänderung an einer Kopie, bevor Sie sie anwenden.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: