Apache Cassandra, en tant que base de données NoSQL distribuée haute performance, utilise des mécanismes d'indexation cruciaux pour améliorer l'efficacité des requêtes. Ce guide approfondi analyse les deux types d'index fondamentaux de Cassandra - les index secondaires et les index SASI - afin d'aider les développeurs à maîtriser les méthodes de récupération de données efficaces.
Comprendre les Index Secondaires
Les index secondaires représentent le type d'index le plus fondamental dans Cassandra, établissant une relation de correspondance entre les colonnes et les clés de ligne pour permettre des requêtes basées sur des colonnes autres que la clé primaire. Leur implémentation principale se trouve dans src/java/org/apache/cassandra/db/index/SecondaryIndex.java, fournissant un cadre de base pour la création, la validation et l'interrogation d'index.
Mécanisme de Fonctionnement des Index Secondaires
Lors de la création d'un index secondaire sur une table, Cassandra maintient automatiquement une table d'index cachée qui stocke la correspondance entre les valeurs de colonnes indexées et les clés primaires. Chaque fois que des données sont écrites, le système met à la fois à jour la table de base et la table d'index, garantissant la cohérence des données. Pour les requêtes, Cassandra utilise d'abord la table d'index pour trouver les clés primaires correspondantes, puis récupère les données complètes à partir de la table de base.
Syntaxe d'Utilisation de Base
La syntaxe standard pour créer un index secondaire est la suivante :
CREATE INDEX [nomIndex] ON tableFamille (nomColonne);
Cette syntaxe, définie dans le fichier src/java/org/apache/cassandra/cql/Cql.g, permet de créer des index sur des colonnes non primaires des tables.
Cas d'Utilisation et Limites
Scénarios d'Application Idéaux :
- Colonnes à faible cardinalité (comme les indicateurs d'état, les étiquettes de catégorie)
- Contextes métier avec beaucoup de lectures et peu d'écritures
- Requêtes auxiliaires sur des champs non clés
Principales Limitations :
- Inadapté aux colonnes à haute cardinalité (comme les ID utilisateur, les horodatages)
- Peut entraîner une augmentation du délai de requête dans les environnements distribués
- La maintenance de l'index consomme des performances d'écriture supplémentaires
Index SASI : Index de Chaînes Avancées
SASI (SSTable Attached Secondary Index) est un type d'index avancé fourni par Cassandra, optimisé spécifiquement pour les performances de requête sur les colonnes de type chaîne, supportant des fonctionnalités avancées comme la correspondance de préfixe et les requêtes d'intervalle.
Avantages Fondamentaux de SASI
Par rapport aux index secondaires traditionnels, SASI offre les fonctionnalités amélioratives suivantes :
- Support des requêtes de correspondance de préfixe (comme
WHERE name LIKE 'J%') - Support des requêtes d'intervalle (comme
WHERE age > 30) - Occupation mémoire réduite et efficacité de requête améliorée
- Analyseur configurable supportant la tokenisation de texte
Exemples de Création et d'Utilisation
La syntaxe CQL pour créer un index SASI est la suivante :
CREATE CUSTOM INDEX ON utilisateurs (nom)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {
'mode': 'CONTAINS',
'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer',
'case_sensitive': 'false'
};
Principes d'Implémentation et Optimisation des Performances
Les index SASI attachent des structures de données d'index dans les fichiers SSTable, évitant ainsi la surcharge de maintenance d'une table d'index séparée comme pour les index secondaires traditionnels. Leur code d'implémentation se trouve dans le paquet org.apache.cassandra.index.sasi, réalisant des capacités de recherche de chaînes efficaces grâce à des analyseurs personnalisés et des modes d'indexation.
Stratégie de Sélection d'Index
Comparaison : Index Secondaires vs SASI
| Caractéristique | Index Secondaires | Index SASI |
|---|---|---|
| Support des types de données | Tous les types | Principalement optimisé pour les chaînes |
| Types de requête | Correspondance exacte | Correspondance exacte, préfixe, intervalle |
| Occupation mémoire | Élevée | Réduite |
| Impact sur les performances d'écriture | Considérable | Faible |
| Cardinalité de données adaptée | Faible cardinalité | Moyenne à haute cardinalité |
Recommandations Pratiques
- Éviter la sur-indexation : Chaque index augmente la charge d'écriture, il est recommandé de créer des index uniquement sur les champs fréquemment interrogés
- Gestion des colonnes à haute cardinalité : Pour les colonnes comme les ID utilisateur uniques, envisager l'utilisation de vues matérialisées comme alternative aux index
- Optimisation des requêtes : L'utilisation prudente de la clause
ALLOW FILTERINGest nécessaire, car elle peut conduire à des balayages de table complète - Maintenance régulière : Optimiser les performances des index avec la commande
nodetool rebuild_index
Gestion et Maintenance des Index
Surveillance de la Création d'Index
Lors de la créasion d'index, Cassandra exécute le processus de construction en arrière-plan. La progression peut être surveillée comme suit :
nodetool compactionstats
Reconstruction d'Index
Lorsque les données d'index présentent des incohérences, la commande suivante permet de reconstruire l'index :
nodetool rebuild_index <espaceCles> <table> <nomIndex>
Suppression d'Index
La suppression des index inutiles libère de l'espace de stockage et améliore les performances d'écriture :
DROP INDEX [IF EXISTS] nomIndex;