Translate

jueves, 18 de julio de 2019

Indices secundarios en Cassandra


Si intentamos filtrar una tabla por una columna que no es parte de la clave primaria, no tendremos éxito, veamos un ejemplo :

cqlsh:my_keyspace> SELECT * FROM user WHERE last_name = 'Goette';

InvalidRequest: code=2200 [Invalid query] message="No supported
secondary index found for the non primary key columns restrictions"

El mensaje de error es claro, nosotros necesitamos crear un indice secundario, para la columna last_name. Los indices secundarios no son parte de la clave primaria y nos permiten filtrar por estos campos.

cqlsh:my_keyspace> CREATE INDEX ON user ( last_name );

Nosotros podemos darle un nombre al indice con la sintaxis :

CREATE INDEX <name> ON... ;

Si no especificamos el nombre, automáticamente utiliza el nombre :
 <table name>_<column name>_idx

Ahora vamos a hacer el mismo select :

cqlsh:my_keyspace> SELECT * FROM user WHERE last_name = 'Nguyen';

first_name | last_name
 ------------+-----------
Bill            | Nguyen

(1 rows)

Se pueden crear indices para tipos simples y colecciones, los mapas se pueden indexar por clave, por valor o por ambos.

Por último podemos remover un indice con drop index, por ejemplo :

cqlsh:my_keyspace> DROP INDEX user_last_name_idx;

Los indices secundarios no son recomendados para los siguientes casos:

  • Columnas muy grandes
  • Columnas con valores poco diferentes como por ejemplo titulo, los valores serán (señor, señorita, …) 
  • Columnas que son actualizadas con mucha frecuencia.