2017-08-22 2 views
0

J'ai 19 millions d'enregistrements dans ma collection mongo. Format de ma collection est:Problème de performance d'indexation MongoDb (mongodb ou spring-batch)

{ 
    "_id" : ObjectId("5992d5a5e7f31a5e90abb881"), 
    "_class" : "com.abc.Try", 
    "field1_code" : "mycode_sdsvmnsbd7986fskljfnsv89s7fmnslfsd78", 
    "field2_id" : "5992d5a5e7f31a5e90abb87e", 
    "field3_id" : NumberLong(1681703), 
    "field4_id" : NumberLong(40119344), 
    "field5_create_date" : ISODate("2015-05-15T09:17:46.000Z"), 
    "field6_update_date" : ISODate("2015-05-31T08:53:59.000Z"), 
    "field7_status" : "active", 
    "field8_status" : "active" 
} 

J'utilise Spring Batch: org.springframework.batch.item.ItemReader<MyCollection>

à lire ma collection, mais sa lecture est assez lent. J'ai donc créé un nouvel index en utilisant la commande:

db.monitoring_profile.createIndex({ field7_status: 1, field8_status: 1, field4_id: 1}) 

Encore sa lenteur. Veuillez suggérer. Je crois que c'est un problème d'indexation mongodb.

Mon Mongo Query est:

{'field7_status': 'active', 'field8_status' : 'active', 'field4_id': { $in: [.... 10000 values....] }} 

Mon Expliquer résultat de la requête est:

db.coll.find({'field7_status': 'active', 'field8_status' : 'active', 'field4_id': { $in: [40009361, 40006884] }}).explain() 

{ 
    "queryPlanner" : { 
     "plannerVersion" : 1, 
     "namespace" : "mycollection.coll", 
     "indexFilterSet" : false, 
     "parsedQuery" : { 
      "$and" : [ 
       { 
        "field7_status" : { 
         "$eq" : "active" 
        } 
       }, 
       { 
        "field8_status" : { 
         "$eq" : "active" 
        } 
       }, 
       { 
        "field4_id" : { 
         "$in" : [ 
          40006884.0, 
          40009361.0 
         ] 
        } 
       } 
      ] 
     }, 
     "winningPlan" : { 
      "stage" : "EOF" 
     }, 
     "rejectedPlans" : [] 
    }, 
    "serverInfo" : { 
     "host" : ".......", 
     "port" : 27017, 
     "version" : "3.4.2", 
     "gitVersion" : "........" 
    }, 
    "ok" : 1.0 
} 
+1

10 000 valeurs en tant qu'argument de '$ in'. Pourquoi? Pourquoi avez-vous besoin d'une requête avec 10 000 résultats ou plus? Quel est le but? Vous ne pouvez pas simplement dire "c'est lent" sans qualifier ce que vous avez réellement besoin de faire. Nous pouvons casser cela à vous soit en prenant complètement la mauvaise approche ou vous n'avez simplement pas développé la bonne architecture pour résoudre le problème réel –

+0

J'ai même essayé avec 1000 et 100. Il est encore lent. Je n'ai pas d'autre alternative pour passer les valeurs dans $ in. S'il vous plaît suggérer si vous en avez (car il n'y a pas de jointures dans mongo). – Shashank

+1

['$ lookup'] (https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/) ressemble beaucoup à une" jointure "pour moi (et pas exactement une nouveauté non plus). Et si '' field_4'' est en fait la propriété la plus limitante, alors ce devrait être le tout premier élément de l'index composé, et non le "troisième". –

Répondre

0

Le winningPlan des Explain semble très étrange. Peut-être pourriez-vous essayer d'utiliser $ et au lieu de $ in pour définir une plage. Par exemple, la plage (20, 60):

db.test.find({'field7_status': 'active', 'field8_status' : 'active', $and : [{'field4_id' : {$gt : 20}, }, {'field4_id' : {$lt : 60}, }] }) 
+0

Merci, mais les valeurs d'entrée de field4_id sont aléatoires et ne proviennent pas de mongodb, elles proviennent d'une autre source. Et si je vais appliquer la gamme alors beaucoup de valeurs seront choisies que je ne veux même pas traiter. – Shashank