Cassandra : Gestion de données (INSERT et SELECT)

Restriction

FondamentalCassandra 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éfinitionFiltrer

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.

ExempleCréation d'un index et restriction

Soit la table ayant le schéma suivant :

CTRL+C pour copier, CTRL+V pour coller
1
CREATE TABLE musique (
2
  id uuid,
3
  ordre_musique int,
4
  titre text,
5
  album text,
6
  artiste text,
7
  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 :

CTRL+C pour copier, CTRL+V pour coller
1
CREATE INDEX ON musique (artiste) ;
CREATE INDEX ON musique (artiste) ;

Ainsi, nous pouvons interroger la base pour obtenir les chansons de Daniel Balavoine et Cassandra pourra récupérer les enregistrements correspondants :

CTRL+C pour copier, CTRL+V pour coller
1
SELECT * FROM musique WHERE artiste = 'Daniel Balavoine';
SELECT * FROM musique WHERE artiste = 'Daniel Balavoine';

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) :

CTRL+C pour copier, CTRL+V pour coller
1
SELECT * FROM musique WHERE ordre_musique = 2 ALLOW FILTERING;
SELECT * FROM musique WHERE ordre_musique = 2 ALLOW FILTERING;

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 :

CTRL+C pour copier, CTRL+V pour coller
1
CREATE TABLE contacts (
2
    id int PRIMARY KEY,
3
    firstName text,
4
    lastName text,
5
    phones map<text, text>,
6
    emails set<text>
7
);
8
CREATE INDEX ON contacts (firstName);
9
CREATE INDEX ON contacts (keys(phones)); // On utilise la fonction keys() pour indexer les clés de la map "phones"
10
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 :

CTRL+C pour copier, CTRL+V pour coller
1
SELECT * FROM contacts WHERE firstname = 'Benjamin';
2
SELECT * FROM contacts WHERE phones CONTAINS KEY 'office';
3
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';
PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Sofian Toujja, Mathieu Moulin, Emilie Confais, Alaeddine Hajjem, David Martins, 2014-2017 (Contributions : Stéphane Crozat, les étudiants de l'UTC) Paternité - Partage des Conditions Initiales à l'IdentiqueRéalisé avec Scenari (nouvelle fenêtre)