2012-04-12 4 views
0

Ich benutze PHP und mongodb. Ich habe System-Profiling auf alles über 20ms eingeschaltet, mit mongodb 2.0.4. Wenn ich eine einfache Seite mit jeder kleinen Abfrage lade, zeichnet es im Systemprofil die gleiche Frage auf wie 4, 10, manchmal 24 mal! Und die Seiten laden deswegen sehr langsam! Warum passiert das?MongoDB mit PHP macht die gleiche Abfrage 4-30 mal

Die Abfrage kann als so einfach sein:

$c2 = $things->find(); 
     foreach($c2 as $doc) { 
      // some code... 
     } 

Dank !!

EDIT: Voll Code:

<?php 

$m = new Mongo(); 
$db = $m->selectDB("test"); 


function getAllData ($db) { 

    $some = $db->some; 

     $cursor = $some->find(); 


     $js = "function() { 
     return (("; 

     foreach ($cursor as $doc) { 
      $js .= "this.idE == '" . $doc['_id'] . "' || "; 

     } 
     $js = substr($js,0,-4); 
     $js .= ")"; 
     $js .= ");}"; 

     $names = $db->names; 
     $c2 = $names->find(array('$where' => $js)); 
     foreach($c2 as $doc) { 
      echo $doc['name']; 
     } 

} 

getAllData ($db); 


?> 
+1

Können Sie ein größeres Code-Snippet posten? – alxbrd

+0

Vollständiger Code hinzugefügt. –

+0

Korreliert die Anzahl der Abfragen mit irgendetwas auf der Seite? Die Anzahl von $ doc zurückgegeben zum Beispiel? Ich denke nur, es könnte ein Nachschlagen wiederholen, wenn Sie '$ doc ['_ id']' aus irgendeinem Grund lesen – Paystey

Antwort

0

Welche der beiden Abfragen multipliziert zu werden?

Ich würde beginnen, den Code zu ändern und sehen, was passiert. Die erste Sache, die ich tun würde, ist das Entfernen der "foreach" und stattdessen nur eine "getNext" und sehen, ob dies die Anzahl der Abfragen der Abfrage beeinflusst. Meine beste Vermutung ist, dass es etwas damit zu tun hat, wie der Mongo-Treiber Ergebnisse in Stapeln holt. Wenn Sie eine Abfrage ausführen, werden nicht alle Zeilen gleichzeitig heruntergeladen, sondern sie werden stapelweise heruntergeladen. Möglicherweise sehen Sie diese Stapelabruf als doppelte Abfragen. Ich denke, dass es einen Mechanismus gibt, mit dem Sie die Batch-Größe anpassen können, was hilfreich sein kann. Auch das Aktualisieren auf die neuesten Treiber kann hilfreich sein.