Cassandra Querytaal (CQL): Invoegen, bijwerken en verwijderen

⚡ Slimme samenvatting

Cassandra Query Language verwerkt invoeg-, update-, verwijder- en leesbewerkingen met een syntaxis die lijkt op die van SQL, maar met een andere onderliggende semantiek. Deze pagina behandelt elk van deze statements, het upsert-gedrag dat invoegen en bijwerken combineert, en de werkelijke beperkingen van de WHERE-clausule.

  • Invoeggedrag: Alleen de primaire sleutel is verplicht; weggelaten kolommen nemen geen opslagruimte in beslag.
  • 🔄 Upsert-semantiek: Invoegen en bijwerken zijn dezelfde bewerking, dus het schrijven naar een bestaande sleutel overschrijft deze stilzwijgend.
  • 🗑️ Verwijderingskosten: Verwijderde rijen worden grafstenen en verdwijnen pas na verdichtingsprocessen.
  • 🔍 Waar de clausule beperkingen oplegt: Filteren werkt op primaire sleutelkolommen, of op andere kolommen zodra er een index bestaat.
  • 📊 Gecombineerde ondersteuning: AANTAL, MIN, MAX, SOM, AVG GROUP BY wordt ondersteund, maar werkt alleen efficiënt binnen één partitie.
  • ???? Nog steeds niet ondersteund: Joins, OR-voorwaarden en analyses over meerdere partities blijven per definitie buiten CQL.

Cassandra CQL Invoegen Bijwerken Verwijderen

Gegevens invoegen

De Cassandra insert-instructie schrijft gegevens in Cassandra kolommen in rijvorm. Cassandra invoegquery slaat alleen de kolommen op die door de gebruiker zijn opgegeven. U hoeft noodzakelijkerwijs alleen de primaire sleutelkolom op te geven.

Er wordt geen ruimte ingenomen voor niet opgegeven waarden. Er worden geen resultaten geretourneerd na het invoegen.

Syntaxis

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

Voorbeeld

Hier is de momentopname van de geëxecuteerde Cassandra Invoegen in tabelquery waarin één record wordt ingevoegd Cassandra tabel 'Studenten'.

Gegevens invoegen

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

Na succesvolle uitvoering van het commando Insert into Cassandra, wordt één rij ingevoegd in de Cassandra tabel Student met Rolnr. 2, Naam Michael, afd. CS en Semester 2.

Hier is de momentopname van de huidige databasestatus.

Gegevens invoegen

Gegevens bijwerken

Cassandra doet opkomen. Upsert betekent dat Cassandra Voegt een rij in als er nog geen primaire sleutel bestaat. Als de primaire sleutel al bestaat, wordt die rij bijgewerkt.

Dit heeft een praktisch gevolg dat het vermelden waard is: een INSERT-instructie meldt nooit een foutmelding over een dubbele sleutel, waardoor een onbedoelde herinvoeging de bestaande rij zonder waarschuwing overschrijft. Om dit te voorkomen, voegt u IF NOT EXISTS toe om de instructie een lichtgewicht transactie te maken.

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

Lichtgewicht transacties maken gebruik van een consensusronde over meerdere replica's, waardoor ze aanzienlijk trager zijn dan een normale schrijfbewerking. Ze dienen daarom alleen te worden gebruikt in gevallen waarin de controle echt nodig is.

Gegevens bijwerken

De Cassandra Bijwerkquery wordt gebruikt om de gegevens in het bestand bij te werken Cassandra tafel. Als er geen resultaten worden geretourneerd na het updaten van de data, betekent dit dat de data succesvol is geüpdatet, anders wordt er een fout geretourneerd. Kolomwaarden worden gewijzigd in de 'Set'-clausule terwijl data wordt gefilterd met de 'Where'-clausule.

Syntaxis

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

Voorbeeld

Hier is de schermafbeelding die de databasestatus toont voordat de gegevens worden bijgewerkt.

Gegevens bijwerken

Hier is de momentopname van de geëxecuteerde Cassandra Update-opdracht waarmee de record in de tabel Student wordt bijgewerkt.

Gegevens bijwerken

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

Na succesvolle uitvoering van de updatequery in Cassandra 'Update Student', de naam van de student wordt gewijzigd van 'Clark' in 'Hayden' met rolnummer 1.

Hier is de schermafbeelding die de databasestatus toont na het updaten van gegevens.

Gegevens bijwerken

Door het upsert-gedrag wordt een UPDATE-bewerking op een primaire sleutel die niet bestaat, aangemaakt in plaats van dat de bewerking mislukt.

Cassandra Verwijder data

Commando 'Verwijderen' verwijdert een hele rij of enkele kolommen uit de tabel Student. Wanneer gegevens worden verwijderd, worden deze niet onmiddellijk uit de tabel verwijderd. In plaats daarvan worden verwijderde gegevens gemarkeerd met een grafsteen en na verdichting verwijderd.

Syntaxis

DELETE FROM KeyspaceName.TableName
WHERE ColumnName1 = ColumnValue;

Bovenstaande Cassandra De rijsyntaxis verwijderen verwijdert een of meer rijen, afhankelijk van de gegevensfiltratie in de Where-clausule.

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

De bovenstaande syntaxis verwijdert enkele kolommen uit de tabel.

Voorbeeld

Hier is de momentopname die de huidige databasestatus toont voordat gegevens worden verwijderd.

Cassandra Verwijder data

Hier is de momentopname van de opdracht die één rij uit de tabel Student verwijdert.

Cassandra Verwijder data

DELETE FROM University.Student WHERE rollno = 1;

Na een succesvolle uitvoering van de CQL Delete-opdracht wordt één rij uit de tabel Student verwijderd waar de waarde van rollno 1 is.

Hier is de momentopname die de databasestatus toont na het verwijderen van gegevens.

Cassandra Verwijder data

Grafstenen blijven gc_grace_seconds, standaard tien dagen, bestaan, zodat een knooppunt dat offline is tijdens het verwijderen de rij niet kan herstellen wanneer het weer online komt. Het verwijderen van grote volumes laat daarom markeringen achter waar elke volgende leesbewerking langs moet scannen.

Wat Cassandra ondersteunt

CQL gebruikt SQL-syntaxis, maar niet het relationele uitvoeringsmodel, waardoor verschillende bekende constructies zich anders gedragen of ontbreken.

  1. CQL ondersteunt geen joins tussen tabellen. Gerelateerde gegevens moeten tijdens het schrijven worden gedenormaliseerd naar één tabel.
  2. CQL ondersteunt geen OR-voorwaarden in een WHERE-clausule. Gebruik IN op een enkele kolom of voer afzonderlijke query's uit.
  3. CQL ondersteunt geen UNION of INTERSECT.
  4. Kolommen die geen primaire sleutel zijn, kunnen pas worden gefilterd als er een index op die kolommen bestaat.
  5. Vergelijkingen met 'groter dan' en 'kleiner dan' zijn alleen van toepassing op clusterkolommen, omdat alleen die kolommen op de schijf gesorteerd zijn.
  6. Patroonherkenning met LIKE vereist een SASI-index en is niet beschikbaar voor gewone kolommen.

Een hardnekkige bewering moet worden rechtgezet. Aggregatiefuncties worden ondersteund: AANTAL, MIN, MAX, SOM en AVG aangekomen in Cassandra 2.2, en GROEP DOOR Aangekomen in 3.10. De kanttekening betreft de reikwijdte, niet de beschikbaarheid.

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

Beperkt tot één enkele partitie zoals hierboven, is een aggregatie efficiënt. Wanneer deze over de hele tabel wordt uitgevoerd, wordt het een clusterbrede scan, vandaar Cassandra blijft ongeschikt voor ad-hocanalyses en daarom wordt uitgebreide rapportage normaal gesproken uitgesteld naar Spark of een extern magazijn.

Cassandra Waar clausule

In Cassandrais het ophalen van gegevens een gevoelige kwestie. De kolom wordt erin gefilterd Cassandra door een index te maken voor niet-primaire sleutelkolommen.

Syntaxis

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

Voorbeeld

  • Hier is de momentopname die het ophalen van gegevens uit de Student-tabel laat zien zonder gegevensfiltratie.

Cassandra Waar clausule

SELECT * FROM University.Student;

Er worden twee records opgehaald uit de Student-tabel.

  • Hier is de momentopname die het ophalen van gegevens uit Student met gegevensfiltratie laat zien. Er wordt één record opgehaald.

De gegevens worden gefilterd op basis van de kolom 'naam'. Alle records worden opgehaald waarvan de naam gelijk is aan... Guru99.

Cassandra Waar clausule

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

De regels die bepalen naar welke kolommen een WHERE-clausule mag verwijzen, vloeien rechtstreeks voort uit de primaire sleutel.

  • De partitiesleutel Voor een efficiënte zoekopdracht moet het volledige adres worden aangeleverd, omdat het de node identificeert die de gegevens bevat.
  • Clusterkolommen kunnen dan worden beperkt, maar alleen in de volgorde waarin ze zijn afgekondigd. Overslaanping Eén ervan wordt afgewezen.
  • Bereikvergelijkingen zijn toegestaan ​​op de laatst geraadpleegde clusterkolom, niet op eerdere kolommen.
  • Elke andere kolom heeft een secundaire index nodig, die wordt behandeld in de index aanmaken en verwijderen tutorial.

Wanneer een query wordt afgewezen, Cassandra Het suggereert vaak om ALLOW FILTERING toe te voegen. Beschouw dit als een waarschuwing in plaats van een oplossing: het scant elke partitie op elke node, en een schemawijziging is vrijwel altijd de juiste reactie.

Veelgestelde vragen

Een batchgroepering van instructies zorgt ervoor dat ze samen slagen of mislukken. Gebruik het om dubbele tabellen synchroon te houden, niet voor bulkinvoer, waarbij een batch over meerdere partities de coördinator aanzienlijk vertraagt.

Stuurprogramma's pagineren automatisch met behulp van een pagineringsstatus-token. In cqlsh stelt PAGING de grootte in. Vermijd het emuleren van OFFSET met een teller, omdat Cassandra heeft geen efficiënte rij-overslaanping mechanisme.

Als een replica langer dan gc_grace_seconds offline is geweest en de tombstone al is verwijderd, houdt die replica de oude rij nog steeds vast en verspreidt deze terug. Regelmatige reparatie voorkomt dit.

Eenvoudige selecties op één tabel worden goed geconverteerd. Alles met een join, OR of subquery heeft geen direct CQL-equivalent, en AI maskeert dit vaak met ALLOW FILTERING, wat geen oplossing is.

Ja. Plakken TRACDe ING ON-uitvoer geeft doorgaans een duidelijk beeld van tombstone-scans, brede partities of cross-node hops. Controleer de voorgestelde schemawijziging op een kopie voordat u deze toepast.

Vat dit bericht samen met: