2013-10-01 5 views
0

J'ai une collection X sur laquelle je dois appliquer un filtre.Algorithme d'optimisation de la recherche d'index composé dans MongoDb

Le filtre est enregistré comme une entité sepparate (filtres à) et les seules données qu'elle détient sont le nom du champ et les conditions appliqué à ce nom de domaine

Exemple de filtre:

Le nom est Stephan et l'âge BETWEEN 10, 20

Fondamentalement ce que je dois améliorer est le fait que chaque champ dans mon filtre est un index ajouté lors de la création du filt er.

La seule structure qui correspond est un index composé sur les champs filtrés.

En conclusion, le problème est que lorsque j'ai un filtre comme:

Nom est Stephan et âge entre 10,20

Mon indice composé MongoDB sera: { « Nom »: 1, « âge »: 1}

Mais, si j'ajoute un autre filtre, disons: L'âge est 10 et le nom est Adrian et hauteur entre 170.180

indice composé

est: { « âge »: 1, 'Nom ': 1,' Hauteur ': 1}

{ 'Nom': 1, 'âge': 1} <> { 'âge': 1, 'Nom': 1, 'Hauteur': 1}

Que puis-je faire pour le dernier ajustement de l'index avec le premier et l'inverse.

S'il vous plaît laissez-moi savoir si je n'ai pas été explicite.

Répondre

1

La solution la plus propre à ce problème est index intersections, qui est actuellement en développement. De cette façon, un index pour chacun des critères serait suffisant.

Dans le même temps, je vois deux options:

  1. Utilisez une base de données de recherche séparée qui renvoie les ids pertinents en fonction de vos critères, puis utilisez $in dans MongoDB pour interroger les documents réels. Il y a un certain nombre d'outils qui utilisent cette approche, mais cela ajoute beaucoup de surcharge parce que vous devez coder et administrer une seconde base de données, garder les données en synchronisation, etc.
  2. Utilisez un mélange intelligent d'index composés et 'requêtes à gamme infinie'. Par exemple, vous pouvez argumenter qu'une requête d'âge de l'ordre de (0, 200) ne rejettera personne du jeu de résultats, pas plus qu'une requête de hauteur entre 0 et 400.

l'approche la plus propre, et son efficacité dépend beaucoup des détails des requêtes, ce qui pourrait nécessiter quelques ajustements.

+0

Comment une intersection d'index pourrait-elle m'aider? Désolé mais je suis un peu flou sur le sujet. – Gabriel

+0

L'intersection des index est une fonctionnalité qui permet à la base de données de combiner plusieurs index, pour ainsi dire. Vous n'avez donc pas besoin d'un index composé pour chaque combinaison possible d'index, mais d'un seul index par critère, par ex.un pour l'âge, le nom et la taille. C'est trois index au lieu de six, ou 'n' indices au lieu de' n! 'Indexes pour le cas général. – mnemosyn

+0

Pouvez-vous s'il vous plaît me dire quelque chose de plus précis pour l'option 'questions à gamme infinie'? – Gabriel