MongoDB 3.0 avec WiredTiger introduit une nouvelle fonctionnalité appelée "Index Prefix Compression" qui réduit considérablement la mémoire consommée par les index. Moins de mémoire utilisée par les index signifie plus de mémoire pour le stockage de documents ou d'autres index, ce qui implique de meilleures performances.
Pour de meilleures performances dans MongoDB, il est préférable de conserver vos index en mémoire. Une page manquante sur un index est un double coup dur - une erreur de page pour mettre la page d'index réelle en mémoire et une autre erreur de page plus tard pour mettre la page de données en mémoire.
Technologie
La compression de préfixe d'index n'utilise pas la compression de bloc (comme zlib, snappy, etc.) mais est une technique différente pour stocker les index en mémoire. Il réduit l'utilisation de la mémoire en stockant les préfixes identiques une seule fois. La « compression de préfixe de clé » est une manière spécifique au domaine de compresser les données et fait référence au format de stockage de clé dans WiredTiger. Pour plus de détails, vous pouvez vous référer à la documentation WiredTiger des formats de fichiers.
Tests de performances
Pour nos tests de performance, nous utilisons une structure de document détaillée ci-dessous :
{ employeeID: <long>, firstName: <string>, lastName: <string>, income: <long>, supervisor: {ID: <long>, 'firstName': <string>, 'lastName': <string>;} }
Nous avons ajouté les index suivants sur cette configuration :
Index 1: db.ensureIndex({'employeeID':1}); Index 2: db.ensureIndex({'lastName':1, 'firstName':1}); Index 3: db.ensureIndex({'income':1}); Index 4: db.ensureIndex({'supervisor.lastName':1, 'supervisor.firstName':1})
Résultats
Lors de notre test, nous avons inséré des données identiques (environ 10 millions d'enregistrements) dans deux clusters - un jeu de réplicas 2.6.x et l'autre un MongoDB 3.0 avec WiredTiger. Ensuite, nous avons ajouté les index ci-dessus sur les deux configurations de cluster. Les résultats sont assez stupéfiants - dans certains cas, il y a une différence d'un ordre de grandeur dans la taille de l'index !
Nom de l'index | Taille de l'index MMAP (Mo) | Taille de l'index WT (Mo) | % de réduction de la taille |
{ID employé :1} | 230,7 | 94 | 59 % |
{lastName :1, firstName :1} | 1530 | 36 | 97 % |
{revenu :1} | 230 | 94 | 59 % |
{‘supervisor.lastName’:1, ‘supervisor.firstName’:1} | 1530 | 35 | 97 % |
Toute la mémoire enregistrée sur les index est une mémoire qui peut être utilisée pour mettre en cache des données, d'autres index, etc. Votre kilométrage peut varier - assurez-vous de tester votre structure d'index particulière. La réduction des tailles d'index est une amélioration très sous-vendue dans Mongo 3.0 et peut faire une énorme différence pour vos performances !