2013-07-08 4 views
0

J'ai une collection appelée survey_data qui a les champs suivantsMongoDB de recherche dans des rails

  1. topic_id
  2. indicator_id
  3. population_id

Le survey_data a plus de 2,8 millions de dossiers. Je veux aller chercher les populations de la collection de populations pour un ensemble donné de indicator_id et topic_id. Mais la requête ci-dessous prend 20 secondes même après avoir ajouté un index composé pour tous les champs.

db.survey_data.find({"topic_id":60,"indicator_id":16) 

Comment puis-je améliorer les performances? Peut être une requête unique en utilisant "mongoid" pour rails3 serait préférable.

Expliquer { "curseur": "BtreeCursor data_source_index", "isMultiKey": false, "n": 2.261.852, "nscannedObjects": 2261852, "nscanned": 2261852, "nscannedObjectsAllPlans": 2261852, "nscannedAllPlans": 2261852, "scanAndOrder": faux, "indexOnly": false, "nYields": 21, "nChunkSkips": 0, "Millis": 19952, "indexBounds": { "data_source_id": [ [ 60, ] ] }

SurveyData Index: index ({DATA_SOURCE_ID: 1, data_source_year_id: 1, indicator_id: 1, indicator_option_id: 1, country_id: 1, provinces_state_id: 1 , health_regions_id: 1, health_regions_type_id: 1, other_administrative_boundary_id: 1, sub_population_options_id: 1, reportability_id: 1}, {Name: "survey_data_index", fond : true} )

+0

S'il vous plaît inclure votre déclaration de ensureIndex. Avez-vous aussi une explication sur la découverte?voir: http://docs.mongodb.org/manual/reference/method/cursor.explain/ –

+0

@MatthewNichols - MongoDB met-il 16seconds à charger environ 1 livre lakh lors de l'exécution d'une requête sur des documents 28lakhs dans une collection avec un seul champ comme condition? – user1428016

+0

Veuillez reformuler. Lakh n'est pas un mot anglais. –

Répondre

1

Trois choses à regarder:

  • topic_id ne semble pas être dans l'index. Essayez de créer un index avec seulement les champs que vous interrogez, dans le même ordre que votre requête.
  • Avez-vous besoin de saisir 100 000 enregistrements en même temps? Si vous tirez les 100 premiers enregistrements en utilisant la limite, cela accélère-t-il les choses?

Il existe de très bonnes ressources sur l'optimisation des requêtes. Voici quelques: