Nous sommes actuellement confrontés à une situation où nous ne pouvons pas éviter de faire une collecte complète . Nous avons déjà optimisé la requête et la structure de données, mais nous aimerions aller plus loin et tirer pleinement parti de la fragmentation et de la réplication.Améliorer les performances de la requête mongodb full-scan: réplication ou sharding?
Configuration
- mongodb version 3.2
- monogo-java-driver 3.2
- storageEngine: wiredTiger
- compression level: snappy
- database size : 6GB
La structure des documents:
individus collection
{
"_id": 1,
"name": "randomName1",
"info": {...}
},
{
"_id": 2,
"name": "randomName2",
"info": {...}
},
[...]
{
"_id": 15000,
"name": "randomName15000",
"info": {...}
}
valeurs collection
{
"_id": ObjectId("5804d7a41da35c2e06467911"),
"pos": NumberLong("2090845886852"),
"val":
[0, 0, 1, 0, 1, ... 0, 1]
},
{
"_id": ObjectId("5804d7a41da35c2e06467912"),
"pos": NumberLong("2090845886857"),
"val":
[1, 1, 1, 0, 1, ... 0, 0]
}
Le tableau "val" contient un élément pour chaque individu (donc la longueur du tableau est de jusqu'à 15000). L'identifiant de l'individu est son index correspondant dans le tableau "val".
Recherche
La requête est de trouver des documents de valeurs collection où la somme de val [individual._id] est au-dessus d'un seuil spécifique pour une liste de idividuals. Nous ne pouvons pas simplement pré-calculer la somme du tableau puisque la liste des individus voulaient changer durant l'exécution (nous pouvons vouloir obtenir le résultat pour seulement les 2000 premiers individus par exemple). Cette requête utilise le cadre d'agrégation.
Ce que nous faisons actuellement:
Nous avons partagé la requête dans 100-500 sous-requêtes et de les exécuter 5 par 5 en parallèle.
La première sous-requête serait la même requête pour les documents où pos> 0 et pos < 50000, le second pour les documents où pos> et pos 50000 < 100000 ect ...
Nous aimerions pouvoir pour exécuter plus de sous-requêtes dans le même temps, mais nous sommes confrontés à une perte de performance lors de l'exécution de plus de 5 sur une seule instance de mongod.
La question est: devrions-nous aller pour la réplication ou pour sharding (ou les deux) dans afin d'exécuter le nombre maximum de sous-requêtes dans le même temps? Comment pouvons-nous configurer mongodb pour répartir au mieux les sous-requêtes entre les répliques/fragments?
edit: supposons que la requête soit déjà complètement optimisée!
Merci pour la réponse! Peut-être que je vais poster l'expliquer dans une autre question, mais pour le moment supposons que la requête est déjà suffisamment optimisée, que devons-nous faire? – felix