Cassandra Език за заявки (CQL): Вмъкване, актуализиране и изтриване

⚡ Умно обобщение

Cassandra Езикът за заявки обработва операциите вмъкване, актуализиране, изтриване и четене със синтаксис, близък до SQL, но с различна семантика. Тази страница разглежда всяка команда, поведението upsert, което обединява вмъкване и актуализиране, и реалните ограничения на клаузата WHERE.

  • Вмъкване на поведение: Само първичният ключ е задължителен, а пропуснатите колони не заемат място за съхранение.
  • 🔄 Семантика на Upsert: Вмъкването и актуализирането са една и съща операция, така че записването на съществуващ ключ тихомълком го презаписва.
  • 🗑️ Изтриване на цената: Премахнатите редове се превръщат в надгробни плочи и изчезват едва след уплътняването.
  • 🔍 Ограничения на клаузата „Къде“: Филтрирането работи върху колони с първичен ключ или върху други колони, след като съществува индекс.
  • 📊 Агрегатна поддръжка: БРОЯ, МИН, МАКС, СУМА AVG и GROUP BY се поддържат, макар и ефективно само в рамките на един дял.
  • 🚫 Все още неподдържано: Съединенията, условията OR и анализите между дялове остават извън CQL по дизайн.

Cassandra CQL Вмъкване Актуализиране Изтриване

Вмъкване на данни

- Cassandra оператор вмъкване записва данни Cassandra колони под формата на ред. Cassandra Заявката за вмъкване ще съхранява само онези колони, които са дадени от потребителя. Трябва задължително да посочите само колоната с първичен ключ.

Няма да заема място за недадени стойности. След вмъкването не се връщат резултати.

Синтаксис

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

Пример

Ето и снимката на екзекутираните Cassandra Заявка за вмъкване в таблица, която ще вмъкне един запис Cassandra таблица "Студент".

Вмъкване на данни

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

След успешно изпълнение на командата Insert into Cassandra, един ред ще бъде вмъкнат в Cassandra таблица Студент със списък No 2, име Майкъл, отдел CS и семестър 2.

Ето моментната снимка на текущото състояние на базата данни.

Вмъкване на данни

Upsert Data

Cassandra прави възмущение. Upsert означава това Cassandra ще вмъкне ред, ако вече не съществува първичен ключ, в противен случай, ако вече съществува първичен ключ, ще актуализира този ред.

Това има практическо последствие, което си струва да се посочи ясно: INSERT никога не докладва грешка за дублиране на ключ, така че случайно повторно вмъкване презаписва съществуващия ред без предупреждение. Когато това трябва да се предотврати, добавете IF NOT EXISTS, за да направите оператора лека транзакция.

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

Леките транзакции използват консенсусен кръг между репликите, така че са значително по-бавни от нормалния запис и трябва да бъдат запазени за случаи, които наистина се нуждаят от проверка.

Актуализиране на данните

- Cassandra Заявката за актуализиране се използва за актуализиране на данните в Cassandra маса. Ако не се върнат резултати след актуализиране на данните, това означава, че данните са актуализирани успешно, в противен случай ще бъде върната грешка. Стойностите на колоните се променят в клаузата „Set“, докато данните се филтрират с клаузата „Where“.

Синтаксис

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

Пример

Ето екранната снимка, която показва състоянието на базата данни преди актуализирането на данните.

Актуализиране на данните

Ето и снимката на екзекутираните Cassandra Команда Update, която актуализира записа в таблицата Student.

Актуализиране на данните

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

След успешното изпълнение на заявката за актуализиране в Cassandra „Актуализиране на ученик“, името на ученика ще бъде променено от „Кларк“ на „Хейдън“, което има rollno 1.

Ето екранната снимка, която показва състоянието на базата данни след актуализиране на данните.

Актуализиране на данните

Поради поведението на upsert, UPDATE срещу първичен ключ, който не съществува, създава реда, вместо да се провали.

Cassandra Изтриване на данни

Командата 'Изтриване' премахва цял ред или няколко колони от таблицата Ученик. Когато данните се изтрият, те не се изтриват веднага от таблицата. Вместо това изтритите данни се маркират с надгробен камък и се премахват след компресирането.

Синтаксис

DELETE FROM KeyspaceName.TableName
WHERE ColumnName1 = ColumnValue;

Горното Cassandra синтаксисът за изтриване на ред ще изтрие един или повече редове в зависимост от филтрирането на данни в клаузата where.

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

Горният синтаксис ще изтрие някои колони от таблицата.

Пример

Ето моментната снимка, която показва текущото състояние на базата данни преди изтриване на данните.

Cassandra Изтриване на данни

Ето моментната снимка на командата, която ще премахне един ред от таблицата Student.

Cassandra Изтриване на данни

DELETE FROM University.Student WHERE rollno = 1;

След успешно изпълнение на командата CQL Delete, един ред ще бъде изтрит от таблицата Student, където стойността на rollno е 1.

Ето моментната снимка, която показва състоянието на базата данни след изтриване на данни.

Cassandra Изтриване на данни

Надгробните плочи (надгробни паметници) се съхраняват за gc_grace_seconds, десет дни по подразбиране, така че възел, който е офлайн по време на изтриването, не може да възкреси реда, когато се върне. Следователно изтриването на големи обеми оставя маркери, покрай които всяко следващо четене трябва да сканира.

Какво Cassandra не поддържа

CQL заимства SQL синтаксиса, но не и релационния модел на изпълнение, така че няколко познати конструкции се държат различно или липсват.

  1. CQL не поддържа съединения между таблици. Свързаните данни трябва да бъдат денормализирани в една таблица по време на запис.
  2. CQL не поддържа условия OR в клауза WHERE. Използвайте IN за една колона или изпълнете отделни заявки.
  3. CQL не поддържа UNION или INTERSECT.
  4. Колоните, които не са с първичен ключ, не могат да бъдат филтрирани, докато върху тях не съществува индекс.
  5. Сравненията „по-голямо от“ и „по-малко от“ се прилагат само за клъстеризирани колони, защото само те се сортират на диска.
  6. Съпоставянето на шаблони с LIKE изисква SASI индекс и не е достъпно за обикновени колони.

Едно дългогодишно твърдение се нуждае от коригиране. Поддържат се агрегатни функции: БРОЙ, МИН, МАКС, СУМА и AVG пристигнах в Cassandra 2.2, и ГРУПИРАЙ ПО пристигна в 3.10. Уговорката е по-скоро обхват, отколкото наличност.

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

Ограничен до един дял, както е описано по-горе, агрегатът е ефективен. Изпълнявайки го върху цялата таблица, той се превръща в сканиране на целия клъстер, поради което... Cassandra остава неподходящ за ad hoc анализи и защо обикновено се насочва към интензивно отчитане Spark или външен склад.

Cassandra Където клаузата

In Cassandra, извличането на данни е чувствителен въпрос. Колоната е филтрирана Cassandra чрез създаване на индекс върху колони с непървичен ключ.

Синтаксис

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

Пример

  • Ето моментната снимка, която показва извличането на данни от таблицата Student без филтриране на данни.

Cassandra Където клаузата

SELECT * FROM University.Student;

Два записа се извличат от таблицата Student.

  • Ето моментната снимка, която показва извличането на данни от Student с филтриране на данни. Един запис е извлечен.

Данните се филтрират по колона с име. Извличат се всички записи, чието име е равно на Guru99.

Cassandra Където клаузата

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

Правилата, определящи кои колони може да препраща клауза WHERE, следват директно от първичния ключ.

  • - ключ за дял трябва да бъде предоставен изцяло за всяка ефективна заявка, защото идентифицира възела, съдържащ данните.
  • Clusterколони могат да бъдат ограничени, но само в реда, в който са били декларирани. Пропусканеping единият е отхвърлен.
  • Сравненията на диапазони са разрешени за последната посочена колона за клъстериране, а не за по-ранни.
  • който и да е друга колона се нуждае от вторичен индекс, обхванат в създаване и премахване на индекс настойнически.

Когато дадено запитване бъде отхвърлено, Cassandra често предлага добавяне на ALLOW FILTERING. Приемете това като предупреждение, а не като решение: сканира всеки дял на всеки възел и промяната на схемата почти винаги е правилният отговор.

Въпроси и Отговори

Пакетът групира оператори, така че те да се изпълнят или да се провалят заедно. Използвайте го, за да поддържате дублираните таблици в синхрон, а не за групово зареждане, където пакетното зареждане в много дялове забавя значително координатора.

Драйверите се пейджират автоматично, използвайки токен за състояние на пейджиране. В cqlsh, PAGING задава размера. Избягвайте емулирането на OFFSET с брояч, защото Cassandra няма ефективно прескачане на редовеping механизъм.

Ако дадена реплика е била неактивна по-дълго от gc_grace_seconds и надгробният камък вече е бил компактиран, тази реплика все още задържа стария ред и го разпространява обратно. Редовният ремонт предотвратява това.

Простите селекции от една таблица се конвертират добре. Всичко с join, OR или подзаявка няма директен CQL еквивалент, а изкуственият интелект често запълва празнината с ALLOW FILTERING, което не е решение.

Да. Поставяне TRACИзходът на ING ON обикновено дава ясна информация за сканирания на надгробни паметници, широки дялове или преходи между възли. Проверете предложената промяна в схемата върху копие, преди да я приложите.

Обобщете тази публикация с: