Concepto de indexación en Apache Cassandra

Requisito previo: Introducción a Apache Cassandra
Index:
ya que podemos acceder a los datos utilizando atributos que tienen la clave de partición. Por ejemplo, si Emp_id es un nombre de columna para la tabla de empleados y si es la clave de partición de esa tabla, podemos filtrar o buscar datos con la ayuda de la clave de partición. En este caso, podemos usar la cláusula WHERE para definir la condición sobre el atributo y buscar datos.
Pero supongamos que existe una columna que no es una clave de partición de esa tabla y queremos filtrar o buscar o acceder a los datos usando la cláusula WHERE, entonces la consulta no se ejecutará y dará un error.

Entonces, para acceder a los datos en ese caso usando atributos distintos a la clave de partición para una búsqueda rápida y eficiente de datos que coincidan con una condición dada, entonces necesitamos definir index. Se puede usar para varios propósitos, como colecciones, columnas estáticas, columnas de colección y cualquier otra columna, excepto columnas de contador.

Cuándo usar un índice:

  1. Los índices incorporados son la mejor opción en una tabla que tiene muchas filas y esas filas contienen el valor indexado.
  2. En una columna en particular, qué columna tiene más valores únicos en ese caso, podemos usar la indexación.
  3. Tabla que tiene más gastos generales debido a varias razones, como la columna que tiene más entradas, entonces en ese caso podemos usar la indexación.
  4. Para consultar y mantener el índice podemos utilizar la indexación que siempre es una buena opción en ese caso.

Ejemplo:
suponga que tiene una tabla de entrada de partidos de cricket con un millón de entradas para jugadores en cientos de partidos y desea buscar la clasificación de los jugadores por el número de partidos jugados. Los rangos de muchos jugadores compartirán el mismo valor de columna para el año del partido. La columna match_year es una buena opción para un índice.

Sintaxis para crear un índice:

CREATE INDEX [ IF NOT EXISTS ] index_name
  ON [keyspace_name.]table_name
  ([ ( KEYS | FULL ) ] column_name) 
  (ENTRIES column_name); 

Ejemplo:
para crear una tabla, se usó keyspace1 como espacio de teclas y Task como nombre de tabla. Echemos un vistazo.

CREATE TABLE keyspace1.Task 
(
   Task_id text,
   Task_name text,
   Task_time timestamp,
   T_location text,
   PRIMARY KEY (Task_id, Task_name)
); 

Como Cassandra es una base de datos distribuida y descentralizada con los datos organizados por clave de partición, en general, las consultas de la cláusula WHERE deben incluir una clave de partición.

Ejemplo:

SELECT * 
FROM Task 
WHERE Task_id = ‘T210’; 

Esta consulta funcionaría bien.

SELECT * 
FROM Task 
WHERE Task_id = ‘T210’ AND Task_name; ‘set alarm’; 

Esta consulta funcionaría bien.

Nota:
En la tabla anterior, las columnas Task_id y Task_name son parte de la clave principal.

SELECT * FROM Task WHERE Task_time= ‘2019-09-30 15:02:56’; 

Esta consulta no funcionaría porque, como podemos ver, aquí Task_time no forma parte de la clave de partición.

Error: Solicitud incorrecta: no hay columnas indexadas presentes en la cláusula por columnas con el operador Igual.

Para resolver este tipo de errores creando un índice en una columna de agrupación. Defina una tabla que tenga una clave de partición compuesta y luego cree un índice en una columna de agrupación.

CREATE TABLE keyspace1.Task (
   Task_id text,
   Task_name text,
   Task_time timestamp,
   T_location text,
  PRIMARY KEY ((Task_id, Task_name), Task_time) 
);
      
CREATE INDEX ON keyspace1.Task(Task_time); 
SELECT * 
FROM Task 
WHERE Task_time= ‘2019-09-30 15:02:56’; 

Ahora esta consulta funcionaría:

Nota:
Al crear un índice tal que la creación de índices secundarios no significa que aumentará la velocidad de las consultas en Cassandra.

Una de las ventajas importantes de los índices secundarios es ayudar a acceder a los datos, lo que simplemente puede hacer que las cláusulas WHERE que hacen referencia a valores en la columna más allá de las columnas primarias y de agrupamiento puedan ejecutarse.

Tenemos una mejor opción para aumentar la velocidad de las consultas en Cassandra que mediante la creación de una tabla específica para la consulta.
Echemos un vistazo a otro ejemplo. En este ejemplo, Student_record es un nombre de tabla y keyspace1 es un nombre de espacio de claves.

CREATE TABLE Student_record 
(
  Stu_state text,
  Stu_zip text,
  Stu_address text,
  PRIMARY KEY(Stu_state, Stu_zip)
 ); 

Aquí, en esta tabla, Stu_state y Stu_zip pueden ser iguales, por lo que, para definir un registro único en una tabla, podemos agregar Stu_id como clave principal que define de forma única el registro.

Ahora podemos hacer modificaciones en la tabla existente usando el comando ALTER en CQL.

ALTER TABLE Student_record ADD Stu_id int PRIMARY KEY; 

Producción:

Tabla: Student_record

Para verificar la descripción de una tabla en Cassandra, usó la siguiente consulta CQL que se proporciona a continuación.
Describir la tabla Student_record;

SELECT * 
FROM Student_record 
WHERE Stu_id = '107'; 

Producción:

Tabla: Salida

Para crear una clave de partición compuesta en Cassandra:
Una clave de partición compuesta se define como la clave en la que una clave de partición tiene más de una columna, entonces se denomina clave de partición compuesta.

Ejemplo:

CREATE TABLE Registration (
  Name text,
  Date timestamp,
  Email text, 
  Query text,
  PRIMARY KEY((Name, Date), Email) WITH CLUSTERING ORDER BY(Date DESC); 
SELECT * 
FROM Registration LIMIT 2; 

Nota:
Hay una clave de fila para cada Fila en Cassandra cuando creamos un índice. Es común tener datos desnormalizados en Cassandra. Es falso que los índices secundarios hagan que las consultas se ejecuten más rápido en Cassandra. Los paréntesis se utilizan para especificar una clave de partición compuesta.

Publicación traducida automáticamente

Artículo escrito por Ashish_rana y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *