Restriction
Fondamental : Cassandra et la restriction.
Comme expliqué précédemment, pour retrouver rapidement une information, Cassandra a besoin de savoir dans quel nœud l'information est située. Elle doit alors chercher sa clé de partitionnement. Conséquence, le WHERE s'applique sur la clé de partitionnement. On peut néanmoins appliquer la restriction WHERE sur une autre colonne au détriment de la performance (car il va parcourir tout le cluster).
Définition : Filtrer
Pour filtrer, Cassandra offre plusieurs possibilités :
l'indexation
le mot clé : ALLOW FILTERING
Indexation
Cassandra nous laisse la possibilité de créer un index sur une colonne.
ALLOW FILTERING
Si on ne souhaite pas créer d'index, on peut utiliser le mot clé ALLOW FILTERING.
Pour exécuter une restriction avec la mention ALLOW FILTERING, Cassandra récupère toutes les données et ensuite enlève les lignes qui ne correspondent pas à la restriction. Mais si il n'y a que 2 lignes qui correspondent, cela n'est pas performant, il est donc préférable d'utiliser un index sur la colonne.
Exemple : Création d'un index et restriction
Soit la table ayant le schéma suivant :
CREATE TABLE musique (
id uuid,
ordre_musique int,
titre text,
album text,
artiste text,
PRIMARY KEY (id, ordre_musique) );
CREATE TABLE musique ( id uuid, ordre_musique int, titre text, album text, artiste text, PRIMARY KEY (id, ordre_musique) );
Si l'on souhaite récupérer toutes les musique d'un artiste, on doit créer un index sur artiste :
Ainsi, nous pouvons interroger la base pour obtenir les chansons de Daniel Balavoine et Cassandra pourra récupérer les enregistrements correspondants :
Au lieu de créer un index, nous pouvons aussi utiliser le mot clé ALLOW FILTERING au détriment de la perfomance (pour une BDD volumineuse) :
Restriction WHERE ... IN
On peut également utiliser la restriction WHERE nom_colonne IN (valeur1, valeur2). Mais cela ne peut s'appliquer qu'à la clé de partition et la première colonne de la clé de clusturisation.
Restriction sur un index secondaire
Sur un second index, on ne peut appliquer que les restrictions utilisant =, CONTAINS et CONTAINS KEY.
CONTAINS s'applique sur les collections.
CONTAINS KEY s'applique sur les maps pour lesquelles la clé a été indexée.
Exemple :
Avec la table suivante :
CREATE TABLE contacts (
id int PRIMARY KEY,
firstName text,
lastName text,
phones map<text, text>,
emails set<text>
);
CREATE INDEX ON contacts (firstName);
CREATE INDEX ON contacts (keys(phones)); // On utilise la fonction keys() pour indexer les clés de la map "phones"
CREATE INDEX ON contacts (emails);
CREATE TABLE contacts ( id int PRIMARY KEY, firstName text, lastName text, phones map<text, text>, emails set<text> ); CREATE INDEX ON contacts (firstName); CREATE INDEX ON contacts (keys(phones)); // On utilise la fonction keys() pour indexer les clés de la map "phones" CREATE INDEX ON contacts (emails);
On peut faire les restrictions suivantes :
SELECT * FROM contacts WHERE firstname = 'Benjamin';
SELECT * FROM contacts WHERE phones CONTAINS KEY 'office';
SELECT * FROM contacts WHERE emails CONTAINS 'Benjamin@oops.com';
SELECT * FROM contacts WHERE firstname = 'Benjamin'; SELECT * FROM contacts WHERE phones CONTAINS KEY 'office'; SELECT * FROM contacts WHERE emails CONTAINS 'Benjamin@oops.com';