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.