2012-04-23 7 views
0

J'essaye d'écrire un php benchmark afin de comparer certains RDBMS, NewSQL et NoSQL. Ce script exécute simplement des requêtes et mesure le temps d'exécution.mysql_query équivalent à mongoDB

Pour MySQL comme, j'utilise simplement:

$start = microtime(true); 
$result = mysql_query($SQL); 
$end = microtime(true); 

Je ne l'ai pas récupérer les données de mon indice de référence.

Mais avec MongoDB-php, fonction find() renvoie une cursor

$start = microtime(true); 
$collection = $this->_db->selectCollection($collection); 
$cursor = $collection->find($query); 
$end = microtime(true); 

Est-ce que $cursor et $result sont équivalent (temps/coût des données)? Le curseur ne charge pas les données, je dois itérer le curseur afin de charger les données .. C'est pourquoi le temps d'exécution des requêtes entre MySQL et mongoDB est si différent ou juste mongoDB ...

Je me demande si ce serait plus juste changer mon code pour:

$start = microtime(true); 
$result = mysql_query($SQL); 
while ($row = mysql_fetch_row($result)) {} 
$end = microtime(true); 

et

$start = microtime(true); 
$cursor = $collection->find($query); 
foreach ($cursor as $doc) {} 
$end = microtime(true); 

et enfin, est-il vrai de dire que chaque fois que vous itérer sur MongoDB données du curseur sont chercher directement à partir du serveur MongoDB et non de la mémoire de l'ordinateur?

Répondre

0

Exécution -> find() renvoie en effet juste le curseur. La requête n'est pas exécutée jusqu'à ce que vous récupériez le premier résultat. À ce moment, le pilote émettra la requête. Cela vous permet de modifier le curseur avec des choses comme -> limit() et -> skip(). Alors oui, il serait plus juste d'itérer sur le jeu de résultats.

Et oui, en itérant sur le curseur mongoDb, les données sont récupérées à partir du serveur MongoDB. Il n'y a pas de requêtes non tamponnées comme avec MySQL (ce qui permet les deux). Bien sûr, MongoDB aura également ces données en mémoire, surtout si vous le faites deux fois l'une après l'autre.

+0

Ok merci, vous avez raison. Mais pensez-vous que ma façon de faire est bonne? Ou il y a une autre solution que je n'ai pas pensée? Ex: utilisez MongoDB :: execute? – Kakawait

+0

Exécuter n'est pas conçu pour exécuter des requêtes, juste pour exécuter du javascript arbitraire. Je n'ai jamais eu à utiliser ça jusqu'à présent. La meilleure chose pour l'analyse comparative serait d'avoir une application réelle, ou peut-être faire des tests d'insertion. – Derick

+0

Oui, pour mon exemple j'ai choisi select query .. Mais mon benchmark va exécuter de nombreux types de requête différents (select, insert, update etc ...) sur une application pseudo-réelle. Mais mon problème est juste à propos de select parce que mongodb utilise le curseur. – Kakawait