2017-09-05 3 views
1

Suite à un tutoriel sur Cassandra, il a été mentionné que si je fais ce qui suit:Toutes les valeurs d'une clé primaire sont-elles indexées?

PRIMARY KEY(id, name) id est la clé de partition et donc il est indexé. Le nom est la colonne de regroupement et donc il est également indexé. Cela signifie que je peux faire une requête telle que:

SELECT * FROM my_table WHERE id = 'id_abc'; //this works! 

Je peux aussi faire une requête telle que:

SELECT * FROM my_table WHERE id = 'id_abc' AND name = 'name_123'; // this works! 

Cependant, je ne peux pas faire la requête suivante:

SELECT * FROM my_table WHERE name = 'name_123'; // this does not work 

Pourquoi la dernière instruction ne fonctionne-t-elle pas si la colonne de clustering est indexée? Pourquoi la première requête fonctionne-t-elle et pas la seconde?

L'erreur que je reçois pour la dernière requête est la suivante:

InvalidRequest: code=2200 [Invalid query] message="Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING" 

Merci à l'avance!

Répondre

2

Juste parce qu'il est nommé clé primaire il n'y a pas d'index dessus dans Cassandra. ìd est votre clé de partition - elle définit quel nœud dans Cassandra est responsable de votre id. La colonne de regroupement name définit l'ordre dans la partition.

Par conséquent, SELECT * FROM my_table WHERE name = 'name_123'; // this does not work exigerait que toutes les partitions soient analysées, ce que refuse par défaut Cassandra.