Cassandra Lenguaje de consulta (CQL): Inserción, actualización y eliminación

⚡ Resumen inteligente

Cassandra El lenguaje de consulta (Query Language) gestiona las operaciones de inserción, actualización, eliminación y lectura con una sintaxis similar a SQL, pero con una semántica interna diferente. Esta página describe cada instrucción, el comportamiento de la operación upsert (que combina las inserciones y actualizaciones) y las limitaciones reales de la cláusula WHERE.

  • ➕ Insertar comportamiento: Solo la clave primaria es obligatoria, y las columnas omitidas no consumen espacio de almacenamiento.
  • 🔄 Semántica de inserción/actualización: Insertar y actualizar son la misma operación, por lo que escribir una clave existente la sobrescribe silenciosamente.
  • 🗑️ Coste de eliminación: Las filas eliminadas se convierten en marcadores de eliminación y solo desaparecen después de que se ejecuta el proceso de compactación.
  • 🔍 Donde la cláusula limita: El filtrado funciona en las columnas de clave primaria, o en otras columnas una vez que existe un índice.
  • 📊 Soporte agregado: CONTAR, MÍNIMO, MÁXIMO, SUMA, AVG Se admiten las funciones GROUP BY, aunque solo de forma eficiente dentro de una misma partición.
  • 🚫 Todavía sin soporte: Las uniones, las condiciones OR y los análisis entre particiones quedan fuera de CQL por diseño.

Cassandra CQL Insertar Actualizar Eliminar

Insertar datos

El Cassandra insertar declaración escribe datos en Cassandra columnas en forma de fila. Cassandra La consulta de inserción almacenará solo aquellas columnas proporcionadas por el usuario. Debe especificar necesariamente solo la columna de clave principal.

No ocupará ningún espacio para los valores no dados. No se devuelven resultados después de la inserción.

Sintaxis

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

Ejemplo

Aquí la instantánea del ejecutado. Cassandra Insertar en la consulta de tabla que insertará un registro en Cassandra tabla 'Estudiante'.

Insertar datos

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

Después de la ejecución exitosa del comando Insertar en Cassandra, se insertará una fila en el Cassandra tabla Estudiante con RollNo 2, Nombre Michael, departamento CS y Semestre 2.

Aquí está la instantánea del estado actual de la base de datos.

Insertar datos

Insertar datos

Cassandra se molesta. Upsert significa que Cassandra insertará una fila si aún no existe una clave principal; de lo contrario, si la clave principal ya existe, actualizará esa fila.

Esto tiene una consecuencia práctica que conviene aclarar: una instrucción INSERT nunca informa de un error de clave duplicada, por lo que una reinserción accidental sobrescribe la fila existente sin previo aviso. Cuando esto deba evitarse, añada IF NOT EXISTS para que la instrucción se convierta en una transacción ligera.

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

Las transacciones ligeras utilizan una ronda de consenso entre réplicas, por lo que son considerablemente más lentas que una escritura normal y deben reservarse para los casos que realmente necesiten la verificación.

Actualizar datos

El Cassandra La consulta de actualización se utiliza para actualizar los datos en el Cassandra mesaSi no se obtienen resultados después de actualizar los datos, significa que los datos se actualizaron correctamente; de ​​lo contrario, se devolverá un error. Los valores de las columnas se modifican en la cláusula "Set" mientras que los datos se filtran con la cláusula "Where".

Sintaxis

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

Ejemplo

Aquí está la captura de pantalla que muestra el estado de la base de datos antes de actualizar los datos.

Actualizar datos

Aquí la instantánea del ejecutado. Cassandra Comando de actualización que actualiza el registro en la tabla de Estudiantes.

Actualizar datos

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

Después de la ejecución exitosa de la consulta de actualización en Cassandra 'Actualizar estudiante', el nombre del estudiante se cambiará de 'Clark' a 'Hayden' que tiene el número 1.

Aquí está la captura de pantalla que muestra el estado de la base de datos después de actualizar los datos.

Actualizar datos

Debido al comportamiento de inserción/actualización, una actualización realizada sobre una clave primaria que no existe crea la fila en lugar de fallar.

Cassandra Borrar datos

El comando "Eliminar" elimina una fila completa o algunas columnas de la tabla Estudiante. Cuando se eliminan datos, no se eliminan de la tabla inmediatamente. En su lugar, los datos eliminados se marcan con una lápida y se eliminan después de la compactación.

Sintaxis

DELETE FROM KeyspaceName.TableName
WHERE ColumnName1 = ColumnValue;

Lo anterior Cassandra La sintaxis de eliminación de filas eliminará una o más filas dependiendo de la filtración de datos en la cláusula Where.

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

La sintaxis anterior eliminará algunas columnas de la tabla.

Ejemplo

Aquí está la instantánea que muestra el estado actual de la base de datos antes de eliminar datos.

Cassandra Borrar datos

Aquí está la instantánea del comando que eliminará una fila de la tabla Estudiante.

Cassandra Borrar datos

DELETE FROM University.Student WHERE rollno = 1;

Tras la ejecución exitosa del comando CQL Delete, se eliminará una fila de la tabla Student donde el valor de rollno sea 1.

Aquí está la instantánea que muestra el estado de la base de datos después de eliminar datos.

Cassandra Borrar datos

Los marcadores de eliminación se conservan durante gc_grace_seconds, diez días por defecto, de modo que un nodo desconectado durante la eliminación no puede recuperar la fila al volver a conectarse. Por lo tanto, al eliminar grandes volúmenes, quedan marcadores que cada lectura posterior debe pasar por alto.

Lo que Cassandra no soporta

CQL toma prestada la sintaxis de SQL, pero no el modelo de ejecución relacional, por lo que varias construcciones familiares se comportan de manera diferente o están ausentes.

  1. CQL no admite uniones entre tablas. Los datos relacionados deben desnormalizarse en una sola tabla al momento de la escritura.
  2. CQL no admite condiciones OR en una cláusula WHERE. Utilice IN en una sola columna o ejecute consultas separadas.
  3. CQL no admite UNION ni INTERSECT.
  4. Las columnas que no son clave primaria no se pueden filtrar hasta que exista un índice sobre ellas.
  5. Las comparaciones de "mayor que" y "menor que" solo se aplican a las columnas de agrupación, porque solo estas se ordenan en el disco.
  6. La coincidencia de patrones con LIKE requiere un índice SASI y no está disponible en columnas ordinarias.

Es necesario corregir una afirmación que lleva mucho tiempo sin resolverse. Se admiten funciones de agregación: CONTAR, MÍNIMO, MÁXIMO, SUMA y AVG llegó a Cassandra 2.2, y GRUPO POR Llegó en la versión 3.10. La salvedad radica en el alcance, no en la disponibilidad.

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

Restringido a una sola partición como se indicó anteriormente, un agregado es eficiente. Ejecutado en toda la tabla se convierte en un escaneo de todo el clúster, por eso Cassandra sigue siendo inadecuado para análisis ad hoc y por qué los informes pesados ​​normalmente se empujan a Spark o un almacén externo.

Cassandra Dónde cláusula

In Cassandra, la recuperación de datos es un tema delicado. La columna se filtra en Cassandra creando un índice en columnas de clave no principal.

Sintaxis

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

Ejemplo

  • Aquí está la instantánea que muestra la recuperación de datos de la tabla de Estudiantes sin filtración de datos.

Cassandra Dónde cláusula

SELECT * FROM University.Student;

Se recuperan dos registros de la tabla de Estudiantes.

  • Aquí está la instantánea que muestra la recuperación de datos de Student con filtración de datos. Se recupera un registro.

Los datos se filtran por la columna nombre. Se recuperan todos los registros que tienen nombre igual a Guru99.

Cassandra Dónde cláusula

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

Las reglas que rigen a qué columnas puede hacer referencia una cláusula WHERE se derivan directamente de la clave primaria.

  • El clave de partición Debe proporcionarse en su totalidad para cualquier consulta eficiente, ya que identifica el nodo que contiene los datos.
  • Clustercolumnas Pueden entonces estar restringidas, pero solo en el orden en que fueron declaradas. Saltarping Uno es rechazado.
  • Las comparaciones de rangos están permitidas en la última columna de agrupamiento a la que se hace referencia, no en las anteriores.
  • Año otra columna necesita un índice secundario, cubierto en el crear y eliminar índice tutorial.

Cuando se rechaza una consulta, Cassandra A menudo sugiere agregar ALLOW FILTERING. Considere esto como una advertencia, no como una solución: escanea cada partición en cada nodo, y un cambio de esquema es casi siempre la respuesta correcta.

Preguntas Frecuentes

Un lote agrupa las sentencias para que se procesen simultáneamente, ya sea que tengan éxito o fallen. Úselo para mantener sincronizadas las tablas duplicadas, no para cargas masivas, ya que un lote que abarque varias particiones ralentiza considerablemente el coordinador.

Los controladores paginan automáticamente usando un token de estado de paginación. En cqlsh, PAGING establece el tamaño. Evite emular OFFSET con un contador, porque Cassandra no tiene salto de fila eficienteping mecanismo.

Si una réplica estuvo inactiva durante más tiempo que gc_grace_seconds y el marcador de eliminación ya se había compactado, esa réplica aún conserva la fila antigua y la vuelve a extender. La reparación regular evita esto.

Las consultas simples de una sola tabla se convierten bien. Cualquier consulta con una unión, OR o subconsulta no tiene un equivalente directo en CQL, y la IA a menudo disimula esta carencia con ALLOW FILTERING, lo cual no es una solución.

Sí. Pegando TRACLa salida de ING ON suele proporcionar una lectura clara de los escaneos de marcadores de eliminación, particiones amplias o saltos entre nodos. Verifique el cambio de esquema sugerido en una copia antes de aplicarlo.

Resumir este post con: