Cassandra Limbaj de interogare (CQL): Inserare, actualizare și ștergere

⚡ Rezumat inteligent

Cassandra Limbajul de interogare gestionează operațiunile de inserare, actualizare, ștergere și citire cu o sintaxă apropiată de SQL, dar cu o semantică diferită. Această pagină prezintă fiecare instrucțiune, comportamentul upsert care îmbină inserarea și actualizarea și limitele reale ale clauzei WHERE.

  • ➕ Comportamentul inserării: Doar cheia primară este obligatorie, iar coloanele omise nu consumă spațiu de stocare.
  • 🔄 Semantica Upsert: Inserarea și actualizarea sunt aceeași operațiune, așadar scrierea unei chei existente o suprascrie în mod silențios.
  • 🗑️ Costul ștergerii: Rândurile eliminate devin pietre funerare și dispar numai după compactarea solului.
  • 🔍 Limitele clauzei Where: Filtrarea funcționează pe coloanele cheie primară sau pe alte coloane odată ce există un index.
  • 📊 Suport agregat: NUMĂRARE, MIN, MAX, SUMĂ, AVG și GROUP BY sunt acceptate, deși eficient doar într-o singură partiție.
  • 🚫 Încă neacceptat: Unirile, condițiile SAU și analizele între partiții rămân în afara CQL prin design.

Cassandra CQL Inserare Actualizare Ștergere

Introduceți date

Cassandra instrucțiunea insert scrie datele în Cassandra coloane sub formă de rând. Cassandra interogarea de inserare va stoca numai acele coloane care sunt date de utilizator. Trebuie să specificați în mod necesar doar coloana cheii primare.

Nu va ocupa spațiu pentru valori nedate. Nu se returnează niciun rezultat după inserare.

Sintaxă

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

Exemplu

Iată instantaneul celui executat Cassandra Interogarea de inserare în tabel care va insera o înregistrare Cassandra tabelul „Student”.

Introduceți date

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

După executarea cu succes a comenzii Insert into Cassandra, un rând va fi inserat în Cassandra Tabel Student cu rola nr. 2, Nume Michael, dept CS și semestrul 2.

Iată un instantaneu al stării curente a bazei de date.

Introduceți date

Upsert Date

Cassandra se supără. Upsert înseamnă că Cassandra va insera un rând dacă o cheie primară nu există deja; altfel, dacă o cheie primară există deja, va actualiza acel rând.

Aceasta are o consecință practică care merită enunțată clar: o instrucțiune INSERT nu raportează niciodată o eroare de cheie duplicată, așa că o reinserție accidentală suprascrie rândul existent fără avertisment. Când acest lucru trebuie prevenit, adăugați IF NOT EXISTS pentru a face din instrucțiune o tranzacție ușoară.

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

Tranzacțiile ușoare utilizează o rundă de consens între replici, deci sunt considerabil mai lente decât o scriere normală și ar trebui rezervate pentru cazurile care necesită cu adevărat verificarea.

Actualizați datele

Cassandra Interogarea de actualizare este utilizată pentru a actualiza datele din Cassandra tabel. Dacă nu se returnează niciun rezultat după actualizarea datelor, înseamnă că datele sunt actualizate cu succes, altfel va fi returnată o eroare. Valorile coloanelor sunt modificate în clauza „Set” în timp ce datele sunt filtrate cu clauza „Unde”.

Sintaxă

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

Exemplu

Iată o captură de ecran care arată starea bazei de date înainte de actualizarea datelor.

Actualizați datele

Iată instantaneul celui executat Cassandra Comanda de actualizare care actualizează înregistrarea din tabelul Student.

Actualizați datele

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

După executarea cu succes a interogării de actualizare în Cassandra „Actualizați student”, numele studentului va fi schimbat din „Clark” în „Hayden” care are numărul 1.

Iată o captură de ecran care arată starea bazei de date după actualizarea datelor.

Actualizați datele

Din cauza comportamentului upsert, o UPDATE pentru o cheie primară care nu există creează rândul în loc să eșueze.

Cassandra Ștergeți datele

Comanda „Șterge” elimină un rând întreg sau unele coloane din tabel Student. Când datele sunt șterse, acestea nu sunt șterse imediat din tabel. În schimb, datele șterse sunt marcate cu o piatră funerară și sunt eliminate după compactare.

Sintaxă

DELETE FROM KeyspaceName.TableName
WHERE ColumnName1 = ColumnValue;

Cele de mai sus Cassandra sintaxa de ștergere a rândului va șterge unul sau mai multe rânduri în funcție de filtrarea datelor în clauza where.

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

Sintaxa de mai sus va șterge unele coloane din tabel.

Exemplu

Iată instantaneul care arată starea curentă a bazei de date înainte de ștergerea datelor.

Cassandra Ștergeți datele

Iată instantaneul comenzii care va elimina un rând din tabel Student.

Cassandra Ștergeți datele

DELETE FROM University.Student WHERE rollno = 1;

După executarea cu succes a comenzii CQL Delete, un rând va fi șters din tabelul Student, unde valoarea rollno este 1.

Iată instantaneul care arată starea bazei de date după ștergerea datelor.

Cassandra Ștergeți datele

Pietrele tombale supraviețuiesc timp de gc_grace_seconds, zece zile în mod implicit, astfel încât un nod offline în timpul ștergerii nu poate reactiva rândul când acesta revine. Prin urmare, ștergerea volumelor mari lasă markeri pe lângă care fiecare citire ulterioară trebuie să scaneze.

Ce Cassandra nu sustine

CQL împrumută sintaxa SQL, dar nu și modelul de execuție relațională, astfel încât mai multe construcții familiare se comportă diferit sau lipsesc.

  1. CQL nu acceptă joncțiuni între tabele. Datele corelate trebuie denormalizate într-un singur tabel la momentul scrierii.
  2. CQL nu acceptă condiții OR într-o clauză WHERE. Folosiți IN pe o singură coloană sau rulați interogări separate.
  3. CQL nu acceptă UNION sau INTERSECT.
  4. Coloanele care nu sunt cheie primară nu pot fi filtrate până când nu există un index pe ele.
  5. Comparațiile mai mare decât și mai mic decât se aplică numai coloanelor de grupare, deoarece doar acestea sunt sortate pe disc.
  6. Potrivirea de șabloane cu LIKE necesită un index SASI și nu este disponibilă pe coloanele obișnuite.

O afirmație veche necesită corectare. Funcțiile agregate sunt acceptate: NUMĂRARE, MIN, MAX, SUMĂ și AVG a sosit in Cassandra 2.2 și A SE GRUPA CU a sosit în versiunea 3.10. Avertismentul este domeniul de aplicare, nu disponibilitatea.

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

Limitat la o singură partiție, așa cum este menționat mai sus, un agregat este eficient. Dacă este rulat pe întreaga tabelă, devine o scanare la nivelul întregului cluster, motiv pentru care Cassandra rămâne nepotrivit pentru analize ad-hoc și de ce raportarea complexă este în mod normal împinsă la Spark sau un depozit extern.

Cassandra Unde este Clauza?

In Cassandra, recuperarea datelor este o problemă sensibilă. Coloana este filtrată Cassandra prin crearea unui index pe coloanele cheie non-primare.

Sintaxă

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

Exemplu

  • Iată instantaneul care arată preluarea datelor din tabelul Student fără filtrarea datelor.

Cassandra Unde este Clauza?

SELECT * FROM University.Student;

Două înregistrări sunt preluate din tabelul Student.

  • Iată instantaneul care arată preluarea datelor de la Student cu filtrarea datelor. O înregistrare este preluată.

Datele sunt filtrate după coloana cu nume. Sunt preluate toate înregistrările care au numele egal cu Guru99.

Cassandra Unde este Clauza?

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

Regulile care guvernează la ce coloane poate face referire o clauză WHERE decurg direct din cheia primară.

  • cheie de partiție trebuie furnizat în întregime pentru orice interogare eficientă, deoarece identifică nodul care deține datele.
  • Clustering coloane pot fi apoi restricționate, dar numai în ordinea în care au fost declarate. Sari pesteping unul este respins.
  • Comparațiile de intervale sunt permise pe ultima coloană de grupare la care se face referire, nu pe cele anterioare.
  • Orice altă coloană are nevoie de un index secundar, acoperit de crearea și eliminarea indexului tutorial.

Când o interogare este respinsă, Cassandra sugerează adesea adăugarea comenzii ALLOW FILTERING. Tratați acest lucru ca pe un avertisment, mai degrabă decât ca pe o soluție: scanează fiecare partiție de pe fiecare nod, iar o modificare a schemei este aproape întotdeauna răspunsul corect.

Întrebări frecvente

O încărcare în lot grupează instrucțiunile astfel încât acestea să reușească sau să eșueze împreună. Folosește-o pentru a menține tabelele duplicate în pas, nu pentru încărcarea în bloc, unde încărcarea în lot pe mai multe partiții încetinește considerabil coordonatorul.

Driverele se afișează automat pagina folosind un token de stare de paginare. În cqlsh, PAGING setează dimensiunea. Evitați emularea OFFSET cu un contor, deoarece Cassandra nu are o săritură eficientă pe rânduriping mecanism.

Dacă o replică a fost nefuncțională mai mult de gc_grace_seconds și piatra tombstone a fost deja compactată, acea replică păstrează în continuare rândul vechi și îl extinde la loc. Reparațiile regulate previn acest lucru.

Selecțiile simple într-un singur tabel convertesc bine. Orice element cu o joncțiune, un SAU sau o subinterogare nu are un echivalent CQL direct, iar inteligența artificială acoperă adesea golul cu ALLOW FILTERING, ceea ce nu este o soluție.

Da. Lipire TRACRezultatul comenzii ING ON oferă de obicei o citire clară a scanărilor tombstone, partițiilor largi sau salturilor între noduri. Verificați modificarea schemei sugerată pe o copie înainte de a o aplica.

Rezumați această postare cu: