Cassandra Jezik upita (CQL): Umetanje, ažuriranje i brisanje

⚡ Pametni sažetak

Cassandra Jezik upita obrađuje operacije umetanja, ažuriranja, brisanja i čitanja sa sintaksom sličnom SQL-u, ali drugačijom semantikom. Ova stranica pokriva svaku naredbu, ponašanje upsert koje spaja umetanje i ažuriranje te stvarna ograničenja klauzule WHERE.

  • Umetni ponašanje: Samo je primarni ključ obavezan, a izostavljeni stupci ne zauzimaju prostor za pohranu.
  • 🔄 Upsert semantika: Umetanje i ažuriranje su ista operacija, pa pisanje postojećeg ključa tiho ga prepisuje.
  • 🗑️ Izbriši trošak: Uklonjeni redovi postaju nadgrobni spomenici i nestaju tek nakon završetka zbijanja.
  • 🔍 Ograničenja klauzule Where: Filtriranje funkcionira na stupcima primarnog ključa ili na drugim stupcima nakon što indeks postoji.
  • 📊 Agregatna podrška: BROJ, MIN, MAX, ZBROJ, AVG i GROUP BY su podržani, iako učinkovito samo unutar jedne particije.
  • ???? Još uvijek nije podržano: Spojevi, ILI uvjeti i analitika među particijama ostaju izvan CQL-a po dizajnu.

Cassandra CQL Umetni Ažuriraj Izbriši

Umetni podatke

The Cassandra insert izjava upisuje podatke Cassandra stupaca u obliku retka. Cassandra upit za umetanje će pohraniti samo one stupce koje je dao korisnik. Morate nužno navesti samo stupac primarnog ključa.

Neće zauzimati prostor za nezadane vrijednosti. Nakon umetanja ne vraćaju se rezultati.

Sintaksa

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

Primjer

Evo snimka strijeljanih Cassandra Upit za umetanje u tablicu koji će umetnuti jedan zapis Cassandra tablica 'Student'.

Umetni podatke

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

Nakon uspješnog izvođenja naredbe Insert into Cassandra, jedan red će biti umetnut u Cassandra stol Student s RollNo 2, ime Michael, odjel CS i semestar 2.

Ovdje je snimka trenutnog stanja baze podataka.

Umetni podatke

Upsert Podaci

Cassandra čini upsert. Upsert znači to Cassandra umetnut će redak ako primarni ključ već ne postoji, inače ako primarni ključ već postoji, ažurirat će taj redak.

To ima praktičnu posljedicu koju vrijedi jasno navesti: INSERT nikada ne prijavljuje grešku dupliciranog ključa, pa slučajno ponovno umetanje prepisuje postojeći redak bez upozorenja. Kada se to mora spriječiti, dodajte IF NOT EXISTS kako biste naredbu učinili laganom transakcijom.

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

Lagane transakcije koriste konsenzusnu rundu među replikama, pa su znatno sporije od normalnog pisanja i trebale bi biti rezervirane za slučajeve kojima je provjera zaista potrebna.

Ažuriranje podataka

The Cassandra Upit za ažuriranje koristi se za ažuriranje podataka u Cassandra stol. Ako se nakon ažuriranja podataka ne vrate nikakvi rezultati, to znači da su podaci uspješno ažurirani, inače će biti vraćena pogreška. Vrijednosti stupaca mijenjaju se u klauzuli 'Set' dok se podaci filtriraju klauzulom 'Where'.

Sintaksa

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

Primjer

Ovdje je snimak zaslona koji prikazuje stanje baze podataka prije ažuriranja podataka.

Ažuriranje podataka

Evo snimka strijeljanih Cassandra Naredba za ažuriranje koja ažurira zapis u tablici učenika.

Ažuriranje podataka

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

Nakon uspješnog izvršenja upita za ažuriranje u Cassandra 'Ažuriraj učenika', ime učenika će se promijeniti iz 'Clark' u 'Hayden' koje ima broj 1.

Ovdje je snimak zaslona koji prikazuje stanje baze podataka nakon ažuriranja podataka.

Ažuriranje podataka

Zbog ponašanja upsert, UPDATE na primarni ključ koji ne postoji stvara redak umjesto da ne uspije.

Cassandra Izbriši podatke

Naredba 'Izbriši' uklanja cijeli redak ili neke stupce iz tablice Student. Kada se podaci izbrišu, ne brišu se odmah iz tablice. Umjesto toga izbrisani podaci označeni su nadgrobnom pločom i uklonjeni su nakon sažimanja.

Sintaksa

DELETE FROM KeyspaceName.TableName
WHERE ColumnName1 = ColumnValue;

Gore Cassandra sintaksa brisanja reda izbrisat će jedan ili više redaka, ovisno o filtraciji podataka u klauzuli where.

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

Gornja sintaksa će izbrisati neke stupce iz tablice.

Primjer

Ovdje je snimka koja prikazuje trenutno stanje baze podataka prije brisanja podataka.

Cassandra Izbriši podatke

Ovdje je snimka naredbe koja će ukloniti jedan red iz tablice Student.

Cassandra Izbriši podatke

DELETE FROM University.Student WHERE rollno = 1;

Nakon uspješnog izvršenja CQL naredbe Delete, jedan red će biti izbrisan iz tablice Student gdje je vrijednost rollno 1.

Ovdje je snimka koja prikazuje stanje baze podataka nakon brisanja podataka.

Cassandra Izbriši podatke

Nadgrobni spomenici opstaju gc_grace_seconds, deset dana prema zadanim postavkama, tako da čvor koji je izvan mreže tijekom brisanja ne može oživjeti redak kada se vrati. Brisanje velikih volumena stoga ostavlja markere koje svako sljedeće čitanje mora skenirati.

Što Cassandra ne podržava

CQL posuđuje SQL sintaksu, ali ne i relacijski model izvršavanja, pa se nekoliko poznatih konstrukata ponaša drugačije ili ih uopće nema.

  1. CQL ne podržava spajanja između tablica. Povezani podaci moraju se denormalizirati u jednu tablicu prilikom pisanja.
  2. CQL ne podržava OR uvjete u WHERE klauzuli. Koristite IN na jednom stupcu ili pokrenite odvojene upite.
  3. CQL ne podržava UNION ili INTERSECT.
  4. Stupci koji nisu primarni ključ ne mogu se filtrirati dok na njima ne postoji indeks.
  5. Usporedbe veće od i manje od primjenjuju se samo na klasteriranje stupaca, jer su samo oni sortirani na disku.
  6. Uspoređivanje uzoraka s LIKE zahtijeva SASI indeks i nije dostupno na običnim stupcima.

Jedan dugogodišnji zahtjev treba ispraviti. Podržane su agregatne funkcije: BROJ, MIN, MAX, ZBROJ i AVG je stigao Cassandra 2.2 i GROUP BY stigao u 3.10. Upozorenje je opseg, a ne dostupnost.

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

Ograničen na jednu particiju kao gore, agregacija je učinkovita. Provođenjem kroz cijelu tablicu postaje skeniranje cijelog klastera, zbog čega Cassandra ostaje neprikladan za ad hoc analitiku i zašto se opsežno izvještavanje obično preusmjerava na Spark ili vanjsko skladište.

Cassandra Gdje je klauzula

In Cassandra, dohvaćanje podataka je osjetljivo pitanje. Stupac je filtriran Cassandra stvaranjem indeksa na stupcima neprimarnog ključa.

Sintaksa

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

Primjer

  • Ovdje je snimka koja prikazuje dohvaćanje podataka iz tablice učenika bez filtriranja podataka.

Cassandra Gdje je klauzula

SELECT * FROM University.Student;

Dva zapisa se dohvaćaju iz tablice Student.

  • Ovdje je snimka koja prikazuje dohvaćanje podataka od Studenta s filtriranjem podataka. Pronađen je jedan zapis.

Podaci se filtriraju prema stupcu naziva. Dohvaćaju se svi zapisi čiji je naziv jednak Guru99.

Cassandra Gdje je klauzula

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

Pravila koja određuju na koje stupce se WHERE klauzula može pozivati ​​​​proizlaze izravno iz primarnog ključa.

  • The ključ particije mora se navesti u cijelosti za bilo koji učinkovit upit, jer identificira čvor koji sadrži podatke.
  • Clusterstupci mogu se tada ograničiti, ali samo redoslijedom kojim su deklarirani. Preskočiping jedan je odbijen.
  • Usporedbe raspona dopuštene su na posljednjem referenciranom stupcu klasteriranja, ne na ranijim.
  • bilo koji drugi stupac potreban je sekundarni indeks, obuhvaćen u stvaranje i brisanje indeksa udžbenik.

Kada je upit odbijen, Cassandra često predlaže dodavanje ALLOW FILTERING. To tretirajte kao upozorenje, a ne kao rješenje: skenira svaku particiju na svakom čvoru, a promjena sheme je gotovo uvijek ispravan odgovor.

Pitanja i odgovori

Serijska naredba grupira naredbe tako da zajedno uspiju ili ne uspiju. Koristite je za održavanje dupliciranih tablica u koraku, a ne za skupno učitavanje, gdje serija na više particija znatno usporava koordinator.

Vozači automatski stranice koriste token stanja straničenja. U cqlsh-u, PAGING postavlja veličinu. Izbjegavajte emuliranje OFFSET-a s brojačem, jer Cassandra nema učinkovito preskakanje redovaping mehanizam.

Ako je replika bila neaktivna dulje od gc_grace_seconds i tombstone je već bio zbijen, ta replika i dalje zadržava stari red i širi ga natrag. Redoviti popravci to sprječavaju.

Jednostavni odabiri iz jedne tablice dobro se konvertiraju. Sve što ima spajanje, ILI ili podupit nema izravni CQL ekvivalent, a umjetna inteligencija često prekriva prazninu s DOPUSTI FILTRIRANJE, što nije rješenje.

Da. Lijepljenje TRACIzlaz naredbe ING ON obično daje jasno očitanje skeniranja tombstonea, širokih particija ili skokova između čvorova. Provjerite predloženu promjenu sheme na kopiji prije nego što je primijenite.

Sažmite ovu objavu uz: