Cassandra Язык запросов (CQL): вставка, обновление и удаление.

⚡ Умное резюме

Cassandra Язык запросов обрабатывает операции вставки, обновления, удаления и чтения с синтаксисом, близким к SQL, но с другой семантикой. На этой странице рассматривается каждое операторное выражение, поведение операции upsert, объединяющей вставку и обновление, а также реальные ограничения предложения WHERE.

  • Вставить поведение: Обязательным является только первичный ключ, а пропущенные столбцы не занимают место в памяти.
  • 🔄 Семантика обновления/вставки: Вставка и обновление — это одна и та же операция, поэтому запись существующего ключа автоматически перезапишет его.
  • 🇧🇷 Удалить стоимость: Удаленные строки становятся надгробными камнями и исчезают только после завершения процесса уплотнения.
  • 🔍 Ограничения, установленные пунктом «Где»: Фильтрация применяется к столбцам первичного ключа, а также к другим столбцам после создания индекса.
  • 📊 Агрегированная поддержка: COUNT, MIN, MAX, SUM, AVG Функции GROUP BY и GROUP BY поддерживаются, хотя эффективно только в пределах одного раздела.
  • ???? Поддержка по-прежнему отсутствует: Объединения, условия ИЛИ и анализ данных между разделами по своей сути остаются вне рамок 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);

После успешного выполнения команды Вставить в Cassandra, одна строка будет вставлена ​​в Cassandra Таблица Студент с номером 2, имя Михаил, кафедра CS и семестр 2.

Вот снимок текущего состояния базы данных.

Вставить данные

Обновить данные

Cassandra расстраивает. Упсерт означает, что 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 «Обновить студента», имя студента будет изменено с «Кларк» на «Хайден», у которого номер 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, и он недоступен для обычных столбцов.

Одно давнее утверждение нуждается в исправлении. Поддерживаются агрегатные функции: COUNT, MIN, MAX, SUM и AVG прибыл в Cassandra 2.2 и ГРУППА ПО Прибыло в 3.10. Примечание касается скорее масштаба, чем доступности.

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

При ограничении одной секцией, как указано выше, агрегирование является эффективным. При же обработке всей таблицы оно превращается в сканирование всего кластера, поэтому... Cassandra остается непригодным для анализа данных в режиме реального времени, и именно поэтому обычно приходится заниматься подготовкой объемных отчетов. Spark или на внешнем складе.

Cassandra Где пункт

In Cassandra, получение данных является деликатным вопросом. Столбец фильтруется по Cassandra путем создания индекса по столбцам, не являющимся первичным ключом.

Синтаксис

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

Пример

  • Вот снимок, показывающий получение данных из таблицы Студентов без фильтрации данных.

Cassandra Где пункт

SELECT * FROM University.Student;

Из таблицы Student извлекаются две записи.

  • Вот снимок, показывающий получение данных от Student с фильтрацией данных. Получается одна запись.

Данные фильтруются по столбцу «Имя». Извлекаются все записи, у которых имя равно [значение столбца]. Guru99.

Cassandra Где пункт

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

Правила, определяющие, на какие столбцы может ссылаться предложение WHERE, вытекают непосредственно из первичного ключа.

  • ключ раздела Для эффективного выполнения запроса необходимо предоставить полный список данных, поскольку он идентифицирует узел, содержащий данные.
  • Clusterстолбцы Затем могут быть введены ограничения, но только в том порядке, в котором они были объявлены. Пропуститьping Один из них отвергнут.
  • Сравнения диапазонов допускаются по последнему столбцу кластеризации, на который дана ссылка, а не по предыдущим.
  • Все другой столбец необходим вторичный указатель, описанный в создать и удалить индекс учебное пособие.

Когда запрос отклоняется, Cassandra Часто предлагается добавить ALLOW FILTERING. Воспринимайте это как предупреждение, а не как решение проблемы: система сканирует каждый раздел на каждом узле, и изменение схемы почти всегда является правильным ответом.

Часто задаваемые вопросы (FAQ)

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

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

Если реплика не работала дольше, чем gc_grace_seconds, и метка "удаления" уже была сжата, эта реплика всё ещё содержит старую строку и распространяет её обратно. Обычное восстановление предотвращает это.

Простые запросы к одной таблице хорошо конвертируются. Для всего, что содержит объединение таблиц, оператор ИЛИ или подзапрос, нет прямого эквивалента в CQL, и ИИ часто заполняет этот пробел с помощью ALLOW FILTERING, что не является решением.

Да. Вставка. TRACВ результате выполнения команды ING ON обычно корректно отображаются данные сканирования удаленных узлов, широкие разделы или переходы между узлами. Перед применением предлагаемого изменения схемы проверьте его на копии.

Подведем итог этой публикации следующим образом: